2022-08-24 16:29:06 +08:00
/ *
THIS IS A GENERATED / BUNDLED FILE BY ESBUILD
if you want to view the source , please visit the github repository of this plugin
* /
var _ _create = Object . create ;
var _ _defProp = Object . defineProperty ;
var _ _getOwnPropDesc = Object . getOwnPropertyDescriptor ;
var _ _getOwnPropNames = Object . getOwnPropertyNames ;
var _ _getProtoOf = Object . getPrototypeOf ;
var _ _hasOwnProp = Object . prototype . hasOwnProperty ;
var _ _markAsModule = ( target ) => _ _defProp ( target , "__esModule" , { value : true } ) ;
var _ _export = ( target , all ) => {
_ _markAsModule ( target ) ;
for ( var name in all )
_ _defProp ( target , name , { get : all [ name ] , enumerable : true } ) ;
} ;
var _ _reExport = ( target , module2 , desc ) => {
if ( module2 && typeof module2 === "object" || typeof module2 === "function" ) {
for ( let key of _ _getOwnPropNames ( module2 ) )
if ( ! _ _hasOwnProp . call ( target , key ) && key !== "default" )
_ _defProp ( target , key , { get : ( ) => module2 [ key ] , enumerable : ! ( desc = _ _getOwnPropDesc ( module2 , key ) ) || desc . enumerable } ) ;
}
return target ;
} ;
var _ _toModule = ( module2 ) => {
return _ _reExport ( _ _markAsModule ( _ _defProp ( module2 != null ? _ _create ( _ _getProtoOf ( module2 ) ) : { } , "default" , module2 && module2 . _ _esModule && "default" in module2 ? { get : ( ) => module2 . default , enumerable : true } : { value : module2 , enumerable : true } ) ) , module2 ) ;
} ;
2023-09-05 17:29:16 +08:00
var _ _toBinary = /* @__PURE__ */ ( ( ) => {
var table = new Uint8Array ( 128 ) ;
for ( var i = 0 ; i < 64 ; i ++ )
table [ i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205 ] = i ;
return ( base64 ) => {
var n = base64 . length , bytes = new Uint8Array ( ( n - ( base64 [ n - 1 ] == "=" ) - ( base64 [ n - 2 ] == "=" ) ) * 3 / 4 | 0 ) ;
for ( var i2 = 0 , j = 0 ; i2 < n ; ) {
var c0 = table [ base64 . charCodeAt ( i2 ++ ) ] , c1 = table [ base64 . charCodeAt ( i2 ++ ) ] ;
var c2 = table [ base64 . charCodeAt ( i2 ++ ) ] , c3 = table [ base64 . charCodeAt ( i2 ++ ) ] ;
bytes [ j ++ ] = c0 << 2 | c1 >> 4 ;
bytes [ j ++ ] = c1 << 4 | c2 >> 2 ;
bytes [ j ++ ] = c2 << 6 | c3 ;
}
return bytes ;
} ;
} ) ( ) ;
2022-08-24 16:29:06 +08:00
// src/main.ts
_ _export ( exports , {
default : ( ) => TemplaterPlugin
} ) ;
2023-10-17 15:38:39 +08:00
var import _obsidian17 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
// src/settings/Settings.ts
var import _obsidian6 = _ _toModule ( require ( "obsidian" ) ) ;
// src/utils/Log.ts
var import _obsidian = _ _toModule ( require ( "obsidian" ) ) ;
function log _error ( e ) {
const notice = new import _obsidian . Notice ( "" , 8e3 ) ;
if ( e instanceof TemplaterError && e . console _msg ) {
notice . noticeEl . innerHTML = ` <b>Templater Error</b>:<br/> ${ e . message } <br/>Check console for more information ` ;
console . error ( ` Templater Error: ` , e . message , "\n" , e . console _msg ) ;
} else {
notice . noticeEl . innerHTML = ` <b>Templater Error</b>:<br/> ${ e . message } ` ;
}
}
// src/utils/Error.ts
var TemplaterError = class extends Error {
constructor ( msg , console _msg ) {
super ( msg ) ;
this . console _msg = console _msg ;
this . name = this . constructor . name ;
Error . captureStackTrace ( this , this . constructor ) ;
}
} ;
2023-09-05 17:29:16 +08:00
async function errorWrapper ( fn2 , msg ) {
try {
return await fn2 ( ) ;
} catch ( e ) {
if ( ! ( e instanceof TemplaterError ) ) {
log _error ( new TemplaterError ( msg , e . message ) ) ;
} else {
log _error ( e ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
return null ;
}
2022-08-24 16:29:06 +08:00
}
function errorWrapperSync ( fn2 , msg ) {
try {
return fn2 ( ) ;
} catch ( e ) {
log _error ( new TemplaterError ( msg , e . message ) ) ;
return null ;
}
}
// src/settings/suggesters/FolderSuggester.ts
var import _obsidian3 = _ _toModule ( require ( "obsidian" ) ) ;
// src/settings/suggesters/suggest.ts
var import _obsidian2 = _ _toModule ( require ( "obsidian" ) ) ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/enums.js
2022-08-24 16:29:06 +08:00
var top = "top" ;
var bottom = "bottom" ;
var right = "right" ;
var left = "left" ;
var auto = "auto" ;
var basePlacements = [ top , bottom , right , left ] ;
var start = "start" ;
var end = "end" ;
var clippingParents = "clippingParents" ;
var viewport = "viewport" ;
var popper = "popper" ;
var reference = "reference" ;
var variationPlacements = /* @__PURE__ */ basePlacements . reduce ( function ( acc , placement ) {
return acc . concat ( [ placement + "-" + start , placement + "-" + end ] ) ;
} , [ ] ) ;
var placements = /* @__PURE__ */ [ ] . concat ( basePlacements , [ auto ] ) . reduce ( function ( acc , placement ) {
return acc . concat ( [ placement , placement + "-" + start , placement + "-" + end ] ) ;
} , [ ] ) ;
var beforeRead = "beforeRead" ;
var read = "read" ;
var afterRead = "afterRead" ;
var beforeMain = "beforeMain" ;
var main = "main" ;
var afterMain = "afterMain" ;
var beforeWrite = "beforeWrite" ;
var write = "write" ;
var afterWrite = "afterWrite" ;
var modifierPhases = [ beforeRead , read , afterRead , beforeMain , main , afterMain , beforeWrite , write , afterWrite ] ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
2022-08-24 16:29:06 +08:00
function getNodeName ( element ) {
return element ? ( element . nodeName || "" ) . toLowerCase ( ) : null ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getWindow.js
2022-08-24 16:29:06 +08:00
function getWindow ( node ) {
if ( node == null ) {
return window ;
}
if ( node . toString ( ) !== "[object Window]" ) {
var ownerDocument = node . ownerDocument ;
return ownerDocument ? ownerDocument . defaultView || window : window ;
}
return node ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
2022-08-24 16:29:06 +08:00
function isElement ( node ) {
var OwnElement = getWindow ( node ) . Element ;
return node instanceof OwnElement || node instanceof Element ;
}
function isHTMLElement ( node ) {
var OwnElement = getWindow ( node ) . HTMLElement ;
return node instanceof OwnElement || node instanceof HTMLElement ;
}
function isShadowRoot ( node ) {
if ( typeof ShadowRoot === "undefined" ) {
return false ;
}
var OwnElement = getWindow ( node ) . ShadowRoot ;
return node instanceof OwnElement || node instanceof ShadowRoot ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/applyStyles.js
2022-08-24 16:29:06 +08:00
function applyStyles ( _ref ) {
var state = _ref . state ;
Object . keys ( state . elements ) . forEach ( function ( name ) {
var style = state . styles [ name ] || { } ;
var attributes = state . attributes [ name ] || { } ;
var element = state . elements [ name ] ;
if ( ! isHTMLElement ( element ) || ! getNodeName ( element ) ) {
return ;
}
Object . assign ( element . style , style ) ;
Object . keys ( attributes ) . forEach ( function ( name2 ) {
var value = attributes [ name2 ] ;
if ( value === false ) {
element . removeAttribute ( name2 ) ;
} else {
element . setAttribute ( name2 , value === true ? "" : value ) ;
}
} ) ;
} ) ;
}
function effect ( _ref2 ) {
var state = _ref2 . state ;
var initialStyles = {
popper : {
position : state . options . strategy ,
left : "0" ,
top : "0" ,
margin : "0"
} ,
arrow : {
position : "absolute"
} ,
reference : { }
} ;
Object . assign ( state . elements . popper . style , initialStyles . popper ) ;
state . styles = initialStyles ;
if ( state . elements . arrow ) {
Object . assign ( state . elements . arrow . style , initialStyles . arrow ) ;
}
return function ( ) {
Object . keys ( state . elements ) . forEach ( function ( name ) {
var element = state . elements [ name ] ;
var attributes = state . attributes [ name ] || { } ;
var styleProperties = Object . keys ( state . styles . hasOwnProperty ( name ) ? state . styles [ name ] : initialStyles [ name ] ) ;
var style = styleProperties . reduce ( function ( style2 , property ) {
style2 [ property ] = "" ;
return style2 ;
} , { } ) ;
if ( ! isHTMLElement ( element ) || ! getNodeName ( element ) ) {
return ;
}
Object . assign ( element . style , style ) ;
Object . keys ( attributes ) . forEach ( function ( attribute ) {
element . removeAttribute ( attribute ) ;
} ) ;
} ) ;
} ;
}
var applyStyles _default = {
name : "applyStyles" ,
enabled : true ,
phase : "write" ,
fn : applyStyles ,
effect ,
requires : [ "computeStyles" ]
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getBasePlacement.js
2022-08-24 16:29:06 +08:00
function getBasePlacement ( placement ) {
return placement . split ( "-" ) [ 0 ] ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/math.js
2022-08-24 16:29:06 +08:00
var max = Math . max ;
var min = Math . min ;
var round = Math . round ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/userAgent.js
function getUAString ( ) {
var uaData = navigator . userAgentData ;
2023-10-17 15:38:39 +08:00
if ( uaData != null && uaData . brands && Array . isArray ( uaData . brands ) ) {
2023-09-05 17:29:16 +08:00
return uaData . brands . map ( function ( item ) {
return item . brand + "/" + item . version ;
} ) . join ( " " ) ;
}
return navigator . userAgent ;
}
// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js
function isLayoutViewport ( ) {
return ! /^((?!chrome|android).)*safari/i . test ( getUAString ( ) ) ;
}
// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
function getBoundingClientRect ( element , includeScale , isFixedStrategy ) {
2022-08-24 16:29:06 +08:00
if ( includeScale === void 0 ) {
includeScale = false ;
}
2023-09-05 17:29:16 +08:00
if ( isFixedStrategy === void 0 ) {
isFixedStrategy = false ;
}
var clientRect = element . getBoundingClientRect ( ) ;
2022-08-24 16:29:06 +08:00
var scaleX = 1 ;
var scaleY = 1 ;
2023-09-05 17:29:16 +08:00
if ( includeScale && isHTMLElement ( element ) ) {
scaleX = element . offsetWidth > 0 ? round ( clientRect . width ) / element . offsetWidth || 1 : 1 ;
scaleY = element . offsetHeight > 0 ? round ( clientRect . height ) / element . offsetHeight || 1 : 1 ;
}
var _ref = isElement ( element ) ? getWindow ( element ) : window , visualViewport = _ref . visualViewport ;
var addVisualOffsets = ! isLayoutViewport ( ) && isFixedStrategy ;
var x = ( clientRect . left + ( addVisualOffsets && visualViewport ? visualViewport . offsetLeft : 0 ) ) / scaleX ;
var y = ( clientRect . top + ( addVisualOffsets && visualViewport ? visualViewport . offsetTop : 0 ) ) / scaleY ;
var width = clientRect . width / scaleX ;
var height = clientRect . height / scaleY ;
2022-08-24 16:29:06 +08:00
return {
2023-09-05 17:29:16 +08:00
width ,
height ,
top : y ,
right : x + width ,
bottom : y + height ,
left : x ,
x ,
y
2022-08-24 16:29:06 +08:00
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
2022-08-24 16:29:06 +08:00
function getLayoutRect ( element ) {
var clientRect = getBoundingClientRect ( element ) ;
var width = element . offsetWidth ;
var height = element . offsetHeight ;
if ( Math . abs ( clientRect . width - width ) <= 1 ) {
width = clientRect . width ;
}
if ( Math . abs ( clientRect . height - height ) <= 1 ) {
height = clientRect . height ;
}
return {
x : element . offsetLeft ,
y : element . offsetTop ,
width ,
height
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/contains.js
2022-08-24 16:29:06 +08:00
function contains ( parent , child ) {
var rootNode = child . getRootNode && child . getRootNode ( ) ;
if ( parent . contains ( child ) ) {
return true ;
} else if ( rootNode && isShadowRoot ( rootNode ) ) {
var next = child ;
do {
if ( next && parent . isSameNode ( next ) ) {
return true ;
}
next = next . parentNode || next . host ;
} while ( next ) ;
}
return false ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
2022-08-24 16:29:06 +08:00
function getComputedStyle ( element ) {
return getWindow ( element ) . getComputedStyle ( element ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
2022-08-24 16:29:06 +08:00
function isTableElement ( element ) {
return [ "table" , "td" , "th" ] . indexOf ( getNodeName ( element ) ) >= 0 ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
2022-08-24 16:29:06 +08:00
function getDocumentElement ( element ) {
return ( ( isElement ( element ) ? element . ownerDocument : element . document ) || window . document ) . documentElement ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
2022-08-24 16:29:06 +08:00
function getParentNode ( element ) {
if ( getNodeName ( element ) === "html" ) {
return element ;
}
return element . assignedSlot || element . parentNode || ( isShadowRoot ( element ) ? element . host : null ) || getDocumentElement ( element ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
2022-08-24 16:29:06 +08:00
function getTrueOffsetParent ( element ) {
if ( ! isHTMLElement ( element ) || getComputedStyle ( element ) . position === "fixed" ) {
return null ;
}
return element . offsetParent ;
}
function getContainingBlock ( element ) {
2023-09-05 17:29:16 +08:00
var isFirefox = /firefox/i . test ( getUAString ( ) ) ;
var isIE = /Trident/i . test ( getUAString ( ) ) ;
2022-08-24 16:29:06 +08:00
if ( isIE && isHTMLElement ( element ) ) {
var elementCss = getComputedStyle ( element ) ;
if ( elementCss . position === "fixed" ) {
return null ;
}
}
var currentNode = getParentNode ( element ) ;
2023-09-05 17:29:16 +08:00
if ( isShadowRoot ( currentNode ) ) {
currentNode = currentNode . host ;
}
2022-08-24 16:29:06 +08:00
while ( isHTMLElement ( currentNode ) && [ "html" , "body" ] . indexOf ( getNodeName ( currentNode ) ) < 0 ) {
var css = getComputedStyle ( currentNode ) ;
if ( css . transform !== "none" || css . perspective !== "none" || css . contain === "paint" || [ "transform" , "perspective" ] . indexOf ( css . willChange ) !== - 1 || isFirefox && css . willChange === "filter" || isFirefox && css . filter && css . filter !== "none" ) {
return currentNode ;
} else {
currentNode = currentNode . parentNode ;
}
}
return null ;
}
function getOffsetParent ( element ) {
var window2 = getWindow ( element ) ;
var offsetParent = getTrueOffsetParent ( element ) ;
while ( offsetParent && isTableElement ( offsetParent ) && getComputedStyle ( offsetParent ) . position === "static" ) {
offsetParent = getTrueOffsetParent ( offsetParent ) ;
}
if ( offsetParent && ( getNodeName ( offsetParent ) === "html" || getNodeName ( offsetParent ) === "body" && getComputedStyle ( offsetParent ) . position === "static" ) ) {
return window2 ;
}
return offsetParent || getContainingBlock ( element ) || window2 ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
2022-08-24 16:29:06 +08:00
function getMainAxisFromPlacement ( placement ) {
return [ "top" , "bottom" ] . indexOf ( placement ) >= 0 ? "x" : "y" ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/within.js
2022-08-24 16:29:06 +08:00
function within ( min2 , value , max2 ) {
return max ( min2 , min ( value , max2 ) ) ;
}
function withinMaxClamp ( min2 , value , max2 ) {
var v = within ( min2 , value , max2 ) ;
return v > max2 ? max2 : v ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
2022-08-24 16:29:06 +08:00
function getFreshSideObject ( ) {
return {
top : 0 ,
right : 0 ,
bottom : 0 ,
left : 0
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
2022-08-24 16:29:06 +08:00
function mergePaddingObject ( paddingObject ) {
return Object . assign ( { } , getFreshSideObject ( ) , paddingObject ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/expandToHashMap.js
2022-08-24 16:29:06 +08:00
function expandToHashMap ( value , keys ) {
return keys . reduce ( function ( hashMap , key ) {
hashMap [ key ] = value ;
return hashMap ;
} , { } ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/arrow.js
2022-08-24 16:29:06 +08:00
var toPaddingObject = function toPaddingObject2 ( padding , state ) {
padding = typeof padding === "function" ? padding ( Object . assign ( { } , state . rects , {
placement : state . placement
} ) ) : padding ;
return mergePaddingObject ( typeof padding !== "number" ? padding : expandToHashMap ( padding , basePlacements ) ) ;
} ;
function arrow ( _ref ) {
var _state$modifiersData$ ;
var state = _ref . state , name = _ref . name , options = _ref . options ;
var arrowElement = state . elements . arrow ;
var popperOffsets2 = state . modifiersData . popperOffsets ;
var basePlacement = getBasePlacement ( state . placement ) ;
var axis = getMainAxisFromPlacement ( basePlacement ) ;
var isVertical = [ left , right ] . indexOf ( basePlacement ) >= 0 ;
var len = isVertical ? "height" : "width" ;
if ( ! arrowElement || ! popperOffsets2 ) {
return ;
}
var paddingObject = toPaddingObject ( options . padding , state ) ;
var arrowRect = getLayoutRect ( arrowElement ) ;
var minProp = axis === "y" ? top : left ;
var maxProp = axis === "y" ? bottom : right ;
var endDiff = state . rects . reference [ len ] + state . rects . reference [ axis ] - popperOffsets2 [ axis ] - state . rects . popper [ len ] ;
var startDiff = popperOffsets2 [ axis ] - state . rects . reference [ axis ] ;
var arrowOffsetParent = getOffsetParent ( arrowElement ) ;
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent . clientHeight || 0 : arrowOffsetParent . clientWidth || 0 : 0 ;
var centerToReference = endDiff / 2 - startDiff / 2 ;
var min2 = paddingObject [ minProp ] ;
var max2 = clientSize - arrowRect [ len ] - paddingObject [ maxProp ] ;
var center = clientSize / 2 - arrowRect [ len ] / 2 + centerToReference ;
var offset2 = within ( min2 , center , max2 ) ;
var axisProp = axis ;
state . modifiersData [ name ] = ( _state$modifiersData$ = { } , _state$modifiersData$ [ axisProp ] = offset2 , _state$modifiersData$ . centerOffset = offset2 - center , _state$modifiersData$ ) ;
}
function effect2 ( _ref2 ) {
var state = _ref2 . state , options = _ref2 . options ;
var _options$element = options . element , arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element ;
if ( arrowElement == null ) {
return ;
}
if ( typeof arrowElement === "string" ) {
arrowElement = state . elements . popper . querySelector ( arrowElement ) ;
if ( ! arrowElement ) {
return ;
}
}
if ( ! contains ( state . elements . popper , arrowElement ) ) {
return ;
}
state . elements . arrow = arrowElement ;
}
var arrow _default = {
name : "arrow" ,
enabled : true ,
phase : "main" ,
fn : arrow ,
effect : effect2 ,
requires : [ "popperOffsets" ] ,
requiresIfExists : [ "preventOverflow" ]
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getVariation.js
2022-08-24 16:29:06 +08:00
function getVariation ( placement ) {
return placement . split ( "-" ) [ 1 ] ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/computeStyles.js
2022-08-24 16:29:06 +08:00
var unsetSides = {
top : "auto" ,
right : "auto" ,
bottom : "auto" ,
left : "auto"
} ;
2023-10-17 15:38:39 +08:00
function roundOffsetsByDPR ( _ref , win ) {
2022-08-24 16:29:06 +08:00
var x = _ref . x , y = _ref . y ;
var dpr = win . devicePixelRatio || 1 ;
return {
x : round ( x * dpr ) / dpr || 0 ,
y : round ( y * dpr ) / dpr || 0
} ;
}
function mapToStyles ( _ref2 ) {
var _Object$assign2 ;
var popper2 = _ref2 . popper , popperRect = _ref2 . popperRect , placement = _ref2 . placement , variation = _ref2 . variation , offsets = _ref2 . offsets , position = _ref2 . position , gpuAcceleration = _ref2 . gpuAcceleration , adaptive = _ref2 . adaptive , roundOffsets = _ref2 . roundOffsets , isFixed = _ref2 . isFixed ;
var _offsets$x = offsets . x , x = _offsets$x === void 0 ? 0 : _offsets$x , _offsets$y = offsets . y , y = _offsets$y === void 0 ? 0 : _offsets$y ;
var _ref3 = typeof roundOffsets === "function" ? roundOffsets ( {
x ,
y
} ) : {
x ,
y
} ;
x = _ref3 . x ;
y = _ref3 . y ;
var hasX = offsets . hasOwnProperty ( "x" ) ;
var hasY = offsets . hasOwnProperty ( "y" ) ;
var sideX = left ;
var sideY = top ;
var win = window ;
if ( adaptive ) {
var offsetParent = getOffsetParent ( popper2 ) ;
var heightProp = "clientHeight" ;
var widthProp = "clientWidth" ;
if ( offsetParent === getWindow ( popper2 ) ) {
offsetParent = getDocumentElement ( popper2 ) ;
if ( getComputedStyle ( offsetParent ) . position !== "static" && position === "absolute" ) {
heightProp = "scrollHeight" ;
widthProp = "scrollWidth" ;
}
}
offsetParent = offsetParent ;
if ( placement === top || ( placement === left || placement === right ) && variation === end ) {
sideY = bottom ;
2023-09-05 17:29:16 +08:00
var offsetY = isFixed && offsetParent === win && win . visualViewport ? win . visualViewport . height : offsetParent [ heightProp ] ;
2022-08-24 16:29:06 +08:00
y -= offsetY - popperRect . height ;
y *= gpuAcceleration ? 1 : - 1 ;
}
if ( placement === left || ( placement === top || placement === bottom ) && variation === end ) {
sideX = right ;
2023-09-05 17:29:16 +08:00
var offsetX = isFixed && offsetParent === win && win . visualViewport ? win . visualViewport . width : offsetParent [ widthProp ] ;
2022-08-24 16:29:06 +08:00
x -= offsetX - popperRect . width ;
x *= gpuAcceleration ? 1 : - 1 ;
}
}
var commonStyles = Object . assign ( {
position
} , adaptive && unsetSides ) ;
var _ref4 = roundOffsets === true ? roundOffsetsByDPR ( {
x ,
y
2023-10-17 15:38:39 +08:00
} , getWindow ( popper2 ) ) : {
2022-08-24 16:29:06 +08:00
x ,
y
} ;
x = _ref4 . x ;
y = _ref4 . y ;
if ( gpuAcceleration ) {
var _Object$assign ;
return Object . assign ( { } , commonStyles , ( _Object$assign = { } , _Object$assign [ sideY ] = hasY ? "0" : "" , _Object$assign [ sideX ] = hasX ? "0" : "" , _Object$assign . transform = ( win . devicePixelRatio || 1 ) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)" , _Object$assign ) ) ;
}
return Object . assign ( { } , commonStyles , ( _Object$assign2 = { } , _Object$assign2 [ sideY ] = hasY ? y + "px" : "" , _Object$assign2 [ sideX ] = hasX ? x + "px" : "" , _Object$assign2 . transform = "" , _Object$assign2 ) ) ;
}
function computeStyles ( _ref5 ) {
var state = _ref5 . state , options = _ref5 . options ;
var _options$gpuAccelerat = options . gpuAcceleration , gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat , _options$adaptive = options . adaptive , adaptive = _options$adaptive === void 0 ? true : _options$adaptive , _options$roundOffsets = options . roundOffsets , roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets ;
var commonStyles = {
placement : getBasePlacement ( state . placement ) ,
variation : getVariation ( state . placement ) ,
popper : state . elements . popper ,
popperRect : state . rects . popper ,
gpuAcceleration ,
isFixed : state . options . strategy === "fixed"
} ;
if ( state . modifiersData . popperOffsets != null ) {
state . styles . popper = Object . assign ( { } , state . styles . popper , mapToStyles ( Object . assign ( { } , commonStyles , {
offsets : state . modifiersData . popperOffsets ,
position : state . options . strategy ,
adaptive ,
roundOffsets
} ) ) ) ;
}
if ( state . modifiersData . arrow != null ) {
state . styles . arrow = Object . assign ( { } , state . styles . arrow , mapToStyles ( Object . assign ( { } , commonStyles , {
offsets : state . modifiersData . arrow ,
position : "absolute" ,
adaptive : false ,
roundOffsets
} ) ) ) ;
}
state . attributes . popper = Object . assign ( { } , state . attributes . popper , {
"data-popper-placement" : state . placement
} ) ;
}
var computeStyles _default = {
name : "computeStyles" ,
enabled : true ,
phase : "beforeWrite" ,
fn : computeStyles ,
data : { }
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/eventListeners.js
2022-08-24 16:29:06 +08:00
var passive = {
passive : true
} ;
function effect3 ( _ref ) {
var state = _ref . state , instance = _ref . instance , options = _ref . options ;
var _options$scroll = options . scroll , scroll = _options$scroll === void 0 ? true : _options$scroll , _options$resize = options . resize , resize = _options$resize === void 0 ? true : _options$resize ;
var window2 = getWindow ( state . elements . popper ) ;
var scrollParents = [ ] . concat ( state . scrollParents . reference , state . scrollParents . popper ) ;
if ( scroll ) {
scrollParents . forEach ( function ( scrollParent ) {
scrollParent . addEventListener ( "scroll" , instance . update , passive ) ;
} ) ;
}
if ( resize ) {
window2 . addEventListener ( "resize" , instance . update , passive ) ;
}
return function ( ) {
if ( scroll ) {
scrollParents . forEach ( function ( scrollParent ) {
scrollParent . removeEventListener ( "scroll" , instance . update , passive ) ;
} ) ;
}
if ( resize ) {
window2 . removeEventListener ( "resize" , instance . update , passive ) ;
}
} ;
}
var eventListeners _default = {
name : "eventListeners" ,
enabled : true ,
phase : "write" ,
fn : function fn ( ) {
} ,
effect : effect3 ,
data : { }
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
2022-08-24 16:29:06 +08:00
var hash = {
left : "right" ,
right : "left" ,
bottom : "top" ,
top : "bottom"
} ;
function getOppositePlacement ( placement ) {
return placement . replace ( /left|right|bottom|top/g , function ( matched ) {
return hash [ matched ] ;
} ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
2022-08-24 16:29:06 +08:00
var hash2 = {
start : "end" ,
end : "start"
} ;
function getOppositeVariationPlacement ( placement ) {
return placement . replace ( /start|end/g , function ( matched ) {
return hash2 [ matched ] ;
} ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
2022-08-24 16:29:06 +08:00
function getWindowScroll ( node ) {
var win = getWindow ( node ) ;
var scrollLeft = win . pageXOffset ;
var scrollTop = win . pageYOffset ;
return {
scrollLeft ,
scrollTop
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
2022-08-24 16:29:06 +08:00
function getWindowScrollBarX ( element ) {
return getBoundingClientRect ( getDocumentElement ( element ) ) . left + getWindowScroll ( element ) . scrollLeft ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
function getViewportRect ( element , strategy ) {
2022-08-24 16:29:06 +08:00
var win = getWindow ( element ) ;
var html = getDocumentElement ( element ) ;
var visualViewport = win . visualViewport ;
var width = html . clientWidth ;
var height = html . clientHeight ;
var x = 0 ;
var y = 0 ;
if ( visualViewport ) {
width = visualViewport . width ;
height = visualViewport . height ;
2023-09-05 17:29:16 +08:00
var layoutViewport = isLayoutViewport ( ) ;
if ( layoutViewport || ! layoutViewport && strategy === "fixed" ) {
2022-08-24 16:29:06 +08:00
x = visualViewport . offsetLeft ;
y = visualViewport . offsetTop ;
}
}
return {
width ,
height ,
x : x + getWindowScrollBarX ( element ) ,
y
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
2022-08-24 16:29:06 +08:00
function getDocumentRect ( element ) {
var _element$ownerDocumen ;
var html = getDocumentElement ( element ) ;
var winScroll = getWindowScroll ( element ) ;
var body = ( _element$ownerDocumen = element . ownerDocument ) == null ? void 0 : _element$ownerDocumen . body ;
var width = max ( html . scrollWidth , html . clientWidth , body ? body . scrollWidth : 0 , body ? body . clientWidth : 0 ) ;
var height = max ( html . scrollHeight , html . clientHeight , body ? body . scrollHeight : 0 , body ? body . clientHeight : 0 ) ;
var x = - winScroll . scrollLeft + getWindowScrollBarX ( element ) ;
var y = - winScroll . scrollTop ;
if ( getComputedStyle ( body || html ) . direction === "rtl" ) {
x += max ( html . clientWidth , body ? body . clientWidth : 0 ) - width ;
}
return {
width ,
height ,
x ,
y
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
2022-08-24 16:29:06 +08:00
function isScrollParent ( element ) {
var _getComputedStyle = getComputedStyle ( element ) , overflow = _getComputedStyle . overflow , overflowX = _getComputedStyle . overflowX , overflowY = _getComputedStyle . overflowY ;
return /auto|scroll|overlay|hidden/ . test ( overflow + overflowY + overflowX ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
2022-08-24 16:29:06 +08:00
function getScrollParent ( node ) {
if ( [ "html" , "body" , "#document" ] . indexOf ( getNodeName ( node ) ) >= 0 ) {
return node . ownerDocument . body ;
}
if ( isHTMLElement ( node ) && isScrollParent ( node ) ) {
return node ;
}
return getScrollParent ( getParentNode ( node ) ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
2022-08-24 16:29:06 +08:00
function listScrollParents ( element , list ) {
var _element$ownerDocumen ;
if ( list === void 0 ) {
list = [ ] ;
}
var scrollParent = getScrollParent ( element ) ;
var isBody = scrollParent === ( ( _element$ownerDocumen = element . ownerDocument ) == null ? void 0 : _element$ownerDocumen . body ) ;
var win = getWindow ( scrollParent ) ;
var target = isBody ? [ win ] . concat ( win . visualViewport || [ ] , isScrollParent ( scrollParent ) ? scrollParent : [ ] ) : scrollParent ;
var updatedList = list . concat ( target ) ;
return isBody ? updatedList : updatedList . concat ( listScrollParents ( getParentNode ( target ) ) ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/rectToClientRect.js
2022-08-24 16:29:06 +08:00
function rectToClientRect ( rect ) {
return Object . assign ( { } , rect , {
left : rect . x ,
top : rect . y ,
right : rect . x + rect . width ,
bottom : rect . y + rect . height
} ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
function getInnerBoundingClientRect ( element , strategy ) {
var rect = getBoundingClientRect ( element , false , strategy === "fixed" ) ;
2022-08-24 16:29:06 +08:00
rect . top = rect . top + element . clientTop ;
rect . left = rect . left + element . clientLeft ;
rect . bottom = rect . top + element . clientHeight ;
rect . right = rect . left + element . clientWidth ;
rect . width = element . clientWidth ;
rect . height = element . clientHeight ;
rect . x = rect . left ;
rect . y = rect . top ;
return rect ;
}
2023-09-05 17:29:16 +08:00
function getClientRectFromMixedType ( element , clippingParent , strategy ) {
return clippingParent === viewport ? rectToClientRect ( getViewportRect ( element , strategy ) ) : isElement ( clippingParent ) ? getInnerBoundingClientRect ( clippingParent , strategy ) : rectToClientRect ( getDocumentRect ( getDocumentElement ( element ) ) ) ;
2022-08-24 16:29:06 +08:00
}
function getClippingParents ( element ) {
var clippingParents2 = listScrollParents ( getParentNode ( element ) ) ;
var canEscapeClipping = [ "absolute" , "fixed" ] . indexOf ( getComputedStyle ( element ) . position ) >= 0 ;
var clipperElement = canEscapeClipping && isHTMLElement ( element ) ? getOffsetParent ( element ) : element ;
if ( ! isElement ( clipperElement ) ) {
return [ ] ;
}
return clippingParents2 . filter ( function ( clippingParent ) {
return isElement ( clippingParent ) && contains ( clippingParent , clipperElement ) && getNodeName ( clippingParent ) !== "body" ;
} ) ;
}
2023-09-05 17:29:16 +08:00
function getClippingRect ( element , boundary , rootBoundary , strategy ) {
2022-08-24 16:29:06 +08:00
var mainClippingParents = boundary === "clippingParents" ? getClippingParents ( element ) : [ ] . concat ( boundary ) ;
var clippingParents2 = [ ] . concat ( mainClippingParents , [ rootBoundary ] ) ;
var firstClippingParent = clippingParents2 [ 0 ] ;
var clippingRect = clippingParents2 . reduce ( function ( accRect , clippingParent ) {
2023-09-05 17:29:16 +08:00
var rect = getClientRectFromMixedType ( element , clippingParent , strategy ) ;
2022-08-24 16:29:06 +08:00
accRect . top = max ( rect . top , accRect . top ) ;
accRect . right = min ( rect . right , accRect . right ) ;
accRect . bottom = min ( rect . bottom , accRect . bottom ) ;
accRect . left = max ( rect . left , accRect . left ) ;
return accRect ;
2023-09-05 17:29:16 +08:00
} , getClientRectFromMixedType ( element , firstClippingParent , strategy ) ) ;
2022-08-24 16:29:06 +08:00
clippingRect . width = clippingRect . right - clippingRect . left ;
clippingRect . height = clippingRect . bottom - clippingRect . top ;
clippingRect . x = clippingRect . left ;
clippingRect . y = clippingRect . top ;
return clippingRect ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/computeOffsets.js
2022-08-24 16:29:06 +08:00
function computeOffsets ( _ref ) {
var reference2 = _ref . reference , element = _ref . element , placement = _ref . placement ;
var basePlacement = placement ? getBasePlacement ( placement ) : null ;
var variation = placement ? getVariation ( placement ) : null ;
var commonX = reference2 . x + reference2 . width / 2 - element . width / 2 ;
var commonY = reference2 . y + reference2 . height / 2 - element . height / 2 ;
var offsets ;
switch ( basePlacement ) {
case top :
offsets = {
x : commonX ,
y : reference2 . y - element . height
} ;
break ;
case bottom :
offsets = {
x : commonX ,
y : reference2 . y + reference2 . height
} ;
break ;
case right :
offsets = {
x : reference2 . x + reference2 . width ,
y : commonY
} ;
break ;
case left :
offsets = {
x : reference2 . x - element . width ,
y : commonY
} ;
break ;
default :
offsets = {
x : reference2 . x ,
y : reference2 . y
} ;
}
var mainAxis = basePlacement ? getMainAxisFromPlacement ( basePlacement ) : null ;
if ( mainAxis != null ) {
var len = mainAxis === "y" ? "height" : "width" ;
switch ( variation ) {
case start :
offsets [ mainAxis ] = offsets [ mainAxis ] - ( reference2 [ len ] / 2 - element [ len ] / 2 ) ;
break ;
case end :
offsets [ mainAxis ] = offsets [ mainAxis ] + ( reference2 [ len ] / 2 - element [ len ] / 2 ) ;
break ;
default :
}
}
return offsets ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/detectOverflow.js
2022-08-24 16:29:06 +08:00
function detectOverflow ( state , options ) {
if ( options === void 0 ) {
options = { } ;
}
2023-09-05 17:29:16 +08:00
var _options = options , _options$placement = _options . placement , placement = _options$placement === void 0 ? state . placement : _options$placement , _options$strategy = _options . strategy , strategy = _options$strategy === void 0 ? state . strategy : _options$strategy , _options$boundary = _options . boundary , boundary = _options$boundary === void 0 ? clippingParents : _options$boundary , _options$rootBoundary = _options . rootBoundary , rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary , _options$elementConte = _options . elementContext , elementContext = _options$elementConte === void 0 ? popper : _options$elementConte , _options$altBoundary = _options . altBoundary , altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary , _options$padding = _options . padding , padding = _options$padding === void 0 ? 0 : _options$padding ;
2022-08-24 16:29:06 +08:00
var paddingObject = mergePaddingObject ( typeof padding !== "number" ? padding : expandToHashMap ( padding , basePlacements ) ) ;
var altContext = elementContext === popper ? reference : popper ;
var popperRect = state . rects . popper ;
var element = state . elements [ altBoundary ? altContext : elementContext ] ;
2023-09-05 17:29:16 +08:00
var clippingClientRect = getClippingRect ( isElement ( element ) ? element : element . contextElement || getDocumentElement ( state . elements . popper ) , boundary , rootBoundary , strategy ) ;
2022-08-24 16:29:06 +08:00
var referenceClientRect = getBoundingClientRect ( state . elements . reference ) ;
var popperOffsets2 = computeOffsets ( {
reference : referenceClientRect ,
element : popperRect ,
strategy : "absolute" ,
placement
} ) ;
var popperClientRect = rectToClientRect ( Object . assign ( { } , popperRect , popperOffsets2 ) ) ;
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect ;
var overflowOffsets = {
top : clippingClientRect . top - elementClientRect . top + paddingObject . top ,
bottom : elementClientRect . bottom - clippingClientRect . bottom + paddingObject . bottom ,
left : clippingClientRect . left - elementClientRect . left + paddingObject . left ,
right : elementClientRect . right - clippingClientRect . right + paddingObject . right
} ;
var offsetData = state . modifiersData . offset ;
if ( elementContext === popper && offsetData ) {
var offset2 = offsetData [ placement ] ;
Object . keys ( overflowOffsets ) . forEach ( function ( key ) {
var multiply = [ right , bottom ] . indexOf ( key ) >= 0 ? 1 : - 1 ;
var axis = [ top , bottom ] . indexOf ( key ) >= 0 ? "y" : "x" ;
overflowOffsets [ key ] += offset2 [ axis ] * multiply ;
} ) ;
}
return overflowOffsets ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
2022-08-24 16:29:06 +08:00
function computeAutoPlacement ( state , options ) {
if ( options === void 0 ) {
options = { } ;
}
var _options = options , placement = _options . placement , boundary = _options . boundary , rootBoundary = _options . rootBoundary , padding = _options . padding , flipVariations = _options . flipVariations , _options$allowedAutoP = _options . allowedAutoPlacements , allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP ;
var variation = getVariation ( placement ) ;
var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements . filter ( function ( placement2 ) {
return getVariation ( placement2 ) === variation ;
} ) : basePlacements ;
var allowedPlacements = placements2 . filter ( function ( placement2 ) {
return allowedAutoPlacements . indexOf ( placement2 ) >= 0 ;
} ) ;
if ( allowedPlacements . length === 0 ) {
allowedPlacements = placements2 ;
}
var overflows = allowedPlacements . reduce ( function ( acc , placement2 ) {
acc [ placement2 ] = detectOverflow ( state , {
placement : placement2 ,
boundary ,
rootBoundary ,
padding
} ) [ getBasePlacement ( placement2 ) ] ;
return acc ;
} , { } ) ;
return Object . keys ( overflows ) . sort ( function ( a , b ) {
return overflows [ a ] - overflows [ b ] ;
} ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/flip.js
2022-08-24 16:29:06 +08:00
function getExpandedFallbackPlacements ( placement ) {
if ( getBasePlacement ( placement ) === auto ) {
return [ ] ;
}
var oppositePlacement = getOppositePlacement ( placement ) ;
return [ getOppositeVariationPlacement ( placement ) , oppositePlacement , getOppositeVariationPlacement ( oppositePlacement ) ] ;
}
function flip ( _ref ) {
var state = _ref . state , options = _ref . options , name = _ref . name ;
if ( state . modifiersData [ name ] . _skip ) {
return ;
}
var _options$mainAxis = options . mainAxis , checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis , _options$altAxis = options . altAxis , checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis , specifiedFallbackPlacements = options . fallbackPlacements , padding = options . padding , boundary = options . boundary , rootBoundary = options . rootBoundary , altBoundary = options . altBoundary , _options$flipVariatio = options . flipVariations , flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio , allowedAutoPlacements = options . allowedAutoPlacements ;
var preferredPlacement = state . options . placement ;
var basePlacement = getBasePlacement ( preferredPlacement ) ;
var isBasePlacement = basePlacement === preferredPlacement ;
var fallbackPlacements = specifiedFallbackPlacements || ( isBasePlacement || ! flipVariations ? [ getOppositePlacement ( preferredPlacement ) ] : getExpandedFallbackPlacements ( preferredPlacement ) ) ;
var placements2 = [ preferredPlacement ] . concat ( fallbackPlacements ) . reduce ( function ( acc , placement2 ) {
return acc . concat ( getBasePlacement ( placement2 ) === auto ? computeAutoPlacement ( state , {
placement : placement2 ,
boundary ,
rootBoundary ,
padding ,
flipVariations ,
allowedAutoPlacements
} ) : placement2 ) ;
} , [ ] ) ;
var referenceRect = state . rects . reference ;
var popperRect = state . rects . popper ;
var checksMap = new Map ( ) ;
var makeFallbackChecks = true ;
var firstFittingPlacement = placements2 [ 0 ] ;
for ( var i = 0 ; i < placements2 . length ; i ++ ) {
var placement = placements2 [ i ] ;
var _basePlacement = getBasePlacement ( placement ) ;
var isStartVariation = getVariation ( placement ) === start ;
var isVertical = [ top , bottom ] . indexOf ( _basePlacement ) >= 0 ;
var len = isVertical ? "width" : "height" ;
var overflow = detectOverflow ( state , {
placement ,
boundary ,
rootBoundary ,
altBoundary ,
padding
} ) ;
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top ;
if ( referenceRect [ len ] > popperRect [ len ] ) {
mainVariationSide = getOppositePlacement ( mainVariationSide ) ;
}
var altVariationSide = getOppositePlacement ( mainVariationSide ) ;
var checks = [ ] ;
if ( checkMainAxis ) {
checks . push ( overflow [ _basePlacement ] <= 0 ) ;
}
if ( checkAltAxis ) {
checks . push ( overflow [ mainVariationSide ] <= 0 , overflow [ altVariationSide ] <= 0 ) ;
}
if ( checks . every ( function ( check ) {
return check ;
} ) ) {
firstFittingPlacement = placement ;
makeFallbackChecks = false ;
break ;
}
checksMap . set ( placement , checks ) ;
}
if ( makeFallbackChecks ) {
var numberOfChecks = flipVariations ? 3 : 1 ;
var _loop = function _loop2 ( _i2 ) {
var fittingPlacement = placements2 . find ( function ( placement2 ) {
var checks2 = checksMap . get ( placement2 ) ;
if ( checks2 ) {
return checks2 . slice ( 0 , _i2 ) . every ( function ( check ) {
return check ;
} ) ;
}
} ) ;
if ( fittingPlacement ) {
firstFittingPlacement = fittingPlacement ;
return "break" ;
}
} ;
for ( var _i = numberOfChecks ; _i > 0 ; _i -- ) {
var _ret = _loop ( _i ) ;
if ( _ret === "break" )
break ;
}
}
if ( state . placement !== firstFittingPlacement ) {
state . modifiersData [ name ] . _skip = true ;
state . placement = firstFittingPlacement ;
state . reset = true ;
}
}
var flip _default = {
name : "flip" ,
enabled : true ,
phase : "main" ,
fn : flip ,
requiresIfExists : [ "offset" ] ,
data : {
_skip : false
}
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/hide.js
2022-08-24 16:29:06 +08:00
function getSideOffsets ( overflow , rect , preventedOffsets ) {
if ( preventedOffsets === void 0 ) {
preventedOffsets = {
x : 0 ,
y : 0
} ;
}
return {
top : overflow . top - rect . height - preventedOffsets . y ,
right : overflow . right - rect . width + preventedOffsets . x ,
bottom : overflow . bottom - rect . height + preventedOffsets . y ,
left : overflow . left - rect . width - preventedOffsets . x
} ;
}
function isAnySideFullyClipped ( overflow ) {
return [ top , right , bottom , left ] . some ( function ( side ) {
return overflow [ side ] >= 0 ;
} ) ;
}
function hide ( _ref ) {
var state = _ref . state , name = _ref . name ;
var referenceRect = state . rects . reference ;
var popperRect = state . rects . popper ;
var preventedOffsets = state . modifiersData . preventOverflow ;
var referenceOverflow = detectOverflow ( state , {
elementContext : "reference"
} ) ;
var popperAltOverflow = detectOverflow ( state , {
altBoundary : true
} ) ;
var referenceClippingOffsets = getSideOffsets ( referenceOverflow , referenceRect ) ;
var popperEscapeOffsets = getSideOffsets ( popperAltOverflow , popperRect , preventedOffsets ) ;
var isReferenceHidden = isAnySideFullyClipped ( referenceClippingOffsets ) ;
var hasPopperEscaped = isAnySideFullyClipped ( popperEscapeOffsets ) ;
state . modifiersData [ name ] = {
referenceClippingOffsets ,
popperEscapeOffsets ,
isReferenceHidden ,
hasPopperEscaped
} ;
state . attributes . popper = Object . assign ( { } , state . attributes . popper , {
"data-popper-reference-hidden" : isReferenceHidden ,
"data-popper-escaped" : hasPopperEscaped
} ) ;
}
var hide _default = {
name : "hide" ,
enabled : true ,
phase : "main" ,
requiresIfExists : [ "preventOverflow" ] ,
fn : hide
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/offset.js
2022-08-24 16:29:06 +08:00
function distanceAndSkiddingToXY ( placement , rects , offset2 ) {
var basePlacement = getBasePlacement ( placement ) ;
var invertDistance = [ left , top ] . indexOf ( basePlacement ) >= 0 ? - 1 : 1 ;
var _ref = typeof offset2 === "function" ? offset2 ( Object . assign ( { } , rects , {
placement
} ) ) : offset2 , skidding = _ref [ 0 ] , distance = _ref [ 1 ] ;
skidding = skidding || 0 ;
distance = ( distance || 0 ) * invertDistance ;
return [ left , right ] . indexOf ( basePlacement ) >= 0 ? {
x : distance ,
y : skidding
} : {
x : skidding ,
y : distance
} ;
}
function offset ( _ref2 ) {
var state = _ref2 . state , options = _ref2 . options , name = _ref2 . name ;
var _options$offset = options . offset , offset2 = _options$offset === void 0 ? [ 0 , 0 ] : _options$offset ;
var data = placements . reduce ( function ( acc , placement ) {
acc [ placement ] = distanceAndSkiddingToXY ( placement , state . rects , offset2 ) ;
return acc ;
} , { } ) ;
var _data$state$placement = data [ state . placement ] , x = _data$state$placement . x , y = _data$state$placement . y ;
if ( state . modifiersData . popperOffsets != null ) {
state . modifiersData . popperOffsets . x += x ;
state . modifiersData . popperOffsets . y += y ;
}
state . modifiersData [ name ] = data ;
}
var offset _default = {
name : "offset" ,
enabled : true ,
phase : "main" ,
requires : [ "popperOffsets" ] ,
fn : offset
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
2022-08-24 16:29:06 +08:00
function popperOffsets ( _ref ) {
var state = _ref . state , name = _ref . name ;
state . modifiersData [ name ] = computeOffsets ( {
reference : state . rects . reference ,
element : state . rects . popper ,
strategy : "absolute" ,
placement : state . placement
} ) ;
}
var popperOffsets _default = {
name : "popperOffsets" ,
enabled : true ,
phase : "read" ,
fn : popperOffsets ,
data : { }
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/getAltAxis.js
2022-08-24 16:29:06 +08:00
function getAltAxis ( axis ) {
return axis === "x" ? "y" : "x" ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
2022-08-24 16:29:06 +08:00
function preventOverflow ( _ref ) {
var state = _ref . state , options = _ref . options , name = _ref . name ;
var _options$mainAxis = options . mainAxis , checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis , _options$altAxis = options . altAxis , checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis , boundary = options . boundary , rootBoundary = options . rootBoundary , altBoundary = options . altBoundary , padding = options . padding , _options$tether = options . tether , tether = _options$tether === void 0 ? true : _options$tether , _options$tetherOffset = options . tetherOffset , tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset ;
var overflow = detectOverflow ( state , {
boundary ,
rootBoundary ,
padding ,
altBoundary
} ) ;
var basePlacement = getBasePlacement ( state . placement ) ;
var variation = getVariation ( state . placement ) ;
var isBasePlacement = ! variation ;
var mainAxis = getMainAxisFromPlacement ( basePlacement ) ;
var altAxis = getAltAxis ( mainAxis ) ;
var popperOffsets2 = state . modifiersData . popperOffsets ;
var referenceRect = state . rects . reference ;
var popperRect = state . rects . popper ;
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset ( Object . assign ( { } , state . rects , {
placement : state . placement
} ) ) : tetherOffset ;
var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
mainAxis : tetherOffsetValue ,
altAxis : tetherOffsetValue
} : Object . assign ( {
mainAxis : 0 ,
altAxis : 0
} , tetherOffsetValue ) ;
var offsetModifierState = state . modifiersData . offset ? state . modifiersData . offset [ state . placement ] : null ;
var data = {
x : 0 ,
y : 0
} ;
if ( ! popperOffsets2 ) {
return ;
}
if ( checkMainAxis ) {
var _offsetModifierState$ ;
var mainSide = mainAxis === "y" ? top : left ;
var altSide = mainAxis === "y" ? bottom : right ;
var len = mainAxis === "y" ? "height" : "width" ;
var offset2 = popperOffsets2 [ mainAxis ] ;
var min2 = offset2 + overflow [ mainSide ] ;
var max2 = offset2 - overflow [ altSide ] ;
var additive = tether ? - popperRect [ len ] / 2 : 0 ;
var minLen = variation === start ? referenceRect [ len ] : popperRect [ len ] ;
var maxLen = variation === start ? - popperRect [ len ] : - referenceRect [ len ] ;
var arrowElement = state . elements . arrow ;
var arrowRect = tether && arrowElement ? getLayoutRect ( arrowElement ) : {
width : 0 ,
height : 0
} ;
var arrowPaddingObject = state . modifiersData [ "arrow#persistent" ] ? state . modifiersData [ "arrow#persistent" ] . padding : getFreshSideObject ( ) ;
var arrowPaddingMin = arrowPaddingObject [ mainSide ] ;
var arrowPaddingMax = arrowPaddingObject [ altSide ] ;
var arrowLen = within ( 0 , referenceRect [ len ] , arrowRect [ len ] ) ;
var minOffset = isBasePlacement ? referenceRect [ len ] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue . mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue . mainAxis ;
var maxOffset = isBasePlacement ? - referenceRect [ len ] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue . mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue . mainAxis ;
var arrowOffsetParent = state . elements . arrow && getOffsetParent ( state . elements . arrow ) ;
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent . clientTop || 0 : arrowOffsetParent . clientLeft || 0 : 0 ;
var offsetModifierValue = ( _offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState [ mainAxis ] ) != null ? _offsetModifierState$ : 0 ;
var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset ;
var tetherMax = offset2 + maxOffset - offsetModifierValue ;
var preventedOffset = within ( tether ? min ( min2 , tetherMin ) : min2 , offset2 , tether ? max ( max2 , tetherMax ) : max2 ) ;
popperOffsets2 [ mainAxis ] = preventedOffset ;
data [ mainAxis ] = preventedOffset - offset2 ;
}
if ( checkAltAxis ) {
var _offsetModifierState$2 ;
var _mainSide = mainAxis === "x" ? top : left ;
var _altSide = mainAxis === "x" ? bottom : right ;
var _offset = popperOffsets2 [ altAxis ] ;
var _len = altAxis === "y" ? "height" : "width" ;
var _min = _offset + overflow [ _mainSide ] ;
var _max = _offset - overflow [ _altSide ] ;
var isOriginSide = [ top , left ] . indexOf ( basePlacement ) !== - 1 ;
var _offsetModifierValue = ( _offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState [ altAxis ] ) != null ? _offsetModifierState$2 : 0 ;
var _tetherMin = isOriginSide ? _min : _offset - referenceRect [ _len ] - popperRect [ _len ] - _offsetModifierValue + normalizedTetherOffsetValue . altAxis ;
var _tetherMax = isOriginSide ? _offset + referenceRect [ _len ] + popperRect [ _len ] - _offsetModifierValue - normalizedTetherOffsetValue . altAxis : _max ;
var _preventedOffset = tether && isOriginSide ? withinMaxClamp ( _tetherMin , _offset , _tetherMax ) : within ( tether ? _tetherMin : _min , _offset , tether ? _tetherMax : _max ) ;
popperOffsets2 [ altAxis ] = _preventedOffset ;
data [ altAxis ] = _preventedOffset - _offset ;
}
state . modifiersData [ name ] = data ;
}
var preventOverflow _default = {
name : "preventOverflow" ,
enabled : true ,
phase : "main" ,
fn : preventOverflow ,
requiresIfExists : [ "offset" ]
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
2022-08-24 16:29:06 +08:00
function getHTMLElementScroll ( element ) {
return {
scrollLeft : element . scrollLeft ,
scrollTop : element . scrollTop
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
2022-08-24 16:29:06 +08:00
function getNodeScroll ( node ) {
if ( node === getWindow ( node ) || ! isHTMLElement ( node ) ) {
return getWindowScroll ( node ) ;
} else {
return getHTMLElementScroll ( node ) ;
}
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
2022-08-24 16:29:06 +08:00
function isElementScaled ( element ) {
var rect = element . getBoundingClientRect ( ) ;
var scaleX = round ( rect . width ) / element . offsetWidth || 1 ;
var scaleY = round ( rect . height ) / element . offsetHeight || 1 ;
return scaleX !== 1 || scaleY !== 1 ;
}
function getCompositeRect ( elementOrVirtualElement , offsetParent , isFixed ) {
if ( isFixed === void 0 ) {
isFixed = false ;
}
var isOffsetParentAnElement = isHTMLElement ( offsetParent ) ;
var offsetParentIsScaled = isHTMLElement ( offsetParent ) && isElementScaled ( offsetParent ) ;
var documentElement = getDocumentElement ( offsetParent ) ;
2023-09-05 17:29:16 +08:00
var rect = getBoundingClientRect ( elementOrVirtualElement , offsetParentIsScaled , isFixed ) ;
2022-08-24 16:29:06 +08:00
var scroll = {
scrollLeft : 0 ,
scrollTop : 0
} ;
var offsets = {
x : 0 ,
y : 0
} ;
if ( isOffsetParentAnElement || ! isOffsetParentAnElement && ! isFixed ) {
if ( getNodeName ( offsetParent ) !== "body" || isScrollParent ( documentElement ) ) {
scroll = getNodeScroll ( offsetParent ) ;
}
if ( isHTMLElement ( offsetParent ) ) {
offsets = getBoundingClientRect ( offsetParent , true ) ;
offsets . x += offsetParent . clientLeft ;
offsets . y += offsetParent . clientTop ;
} else if ( documentElement ) {
offsets . x = getWindowScrollBarX ( documentElement ) ;
}
}
return {
x : rect . left + scroll . scrollLeft - offsets . x ,
y : rect . top + scroll . scrollTop - offsets . y ,
width : rect . width ,
height : rect . height
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/orderModifiers.js
2022-08-24 16:29:06 +08:00
function order ( modifiers ) {
var map = new Map ( ) ;
var visited = new Set ( ) ;
var result = [ ] ;
modifiers . forEach ( function ( modifier ) {
map . set ( modifier . name , modifier ) ;
} ) ;
function sort ( modifier ) {
visited . add ( modifier . name ) ;
var requires = [ ] . concat ( modifier . requires || [ ] , modifier . requiresIfExists || [ ] ) ;
requires . forEach ( function ( dep ) {
if ( ! visited . has ( dep ) ) {
var depModifier = map . get ( dep ) ;
if ( depModifier ) {
sort ( depModifier ) ;
}
}
} ) ;
result . push ( modifier ) ;
}
modifiers . forEach ( function ( modifier ) {
if ( ! visited . has ( modifier . name ) ) {
sort ( modifier ) ;
}
} ) ;
return result ;
}
function orderModifiers ( modifiers ) {
var orderedModifiers = order ( modifiers ) ;
return modifierPhases . reduce ( function ( acc , phase ) {
return acc . concat ( orderedModifiers . filter ( function ( modifier ) {
return modifier . phase === phase ;
} ) ) ;
} , [ ] ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/debounce.js
2022-08-24 16:29:06 +08:00
function debounce ( fn2 ) {
var pending ;
return function ( ) {
if ( ! pending ) {
2023-09-05 17:29:16 +08:00
pending = new Promise ( function ( resolve ) {
2022-08-24 16:29:06 +08:00
Promise . resolve ( ) . then ( function ( ) {
pending = void 0 ;
2023-09-05 17:29:16 +08:00
resolve ( fn2 ( ) ) ;
2022-08-24 16:29:06 +08:00
} ) ;
} ) ;
}
return pending ;
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/utils/mergeByName.js
2022-08-24 16:29:06 +08:00
function mergeByName ( modifiers ) {
var merged = modifiers . reduce ( function ( merged2 , current ) {
var existing = merged2 [ current . name ] ;
merged2 [ current . name ] = existing ? Object . assign ( { } , existing , current , {
options : Object . assign ( { } , existing . options , current . options ) ,
data : Object . assign ( { } , existing . data , current . data )
} ) : current ;
return merged2 ;
} , { } ) ;
return Object . keys ( merged ) . map ( function ( key ) {
return merged [ key ] ;
} ) ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/createPopper.js
2022-08-24 16:29:06 +08:00
var DEFAULT _OPTIONS = {
placement : "bottom" ,
modifiers : [ ] ,
strategy : "absolute"
} ;
function areValidElements ( ) {
for ( var _len = arguments . length , args = new Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) {
args [ _key ] = arguments [ _key ] ;
}
return ! args . some ( function ( element ) {
return ! ( element && typeof element . getBoundingClientRect === "function" ) ;
} ) ;
}
function popperGenerator ( generatorOptions ) {
if ( generatorOptions === void 0 ) {
generatorOptions = { } ;
}
var _generatorOptions = generatorOptions , _generatorOptions$def = _generatorOptions . defaultModifiers , defaultModifiers2 = _generatorOptions$def === void 0 ? [ ] : _generatorOptions$def , _generatorOptions$def2 = _generatorOptions . defaultOptions , defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT _OPTIONS : _generatorOptions$def2 ;
return function createPopper2 ( reference2 , popper2 , options ) {
if ( options === void 0 ) {
options = defaultOptions ;
}
var state = {
placement : "bottom" ,
orderedModifiers : [ ] ,
options : Object . assign ( { } , DEFAULT _OPTIONS , defaultOptions ) ,
modifiersData : { } ,
elements : {
reference : reference2 ,
popper : popper2
} ,
attributes : { } ,
styles : { }
} ;
var effectCleanupFns = [ ] ;
var isDestroyed = false ;
var instance = {
state ,
setOptions : function setOptions ( setOptionsAction ) {
var options2 = typeof setOptionsAction === "function" ? setOptionsAction ( state . options ) : setOptionsAction ;
cleanupModifierEffects ( ) ;
state . options = Object . assign ( { } , defaultOptions , state . options , options2 ) ;
state . scrollParents = {
reference : isElement ( reference2 ) ? listScrollParents ( reference2 ) : reference2 . contextElement ? listScrollParents ( reference2 . contextElement ) : [ ] ,
popper : listScrollParents ( popper2 )
} ;
var orderedModifiers = orderModifiers ( mergeByName ( [ ] . concat ( defaultModifiers2 , state . options . modifiers ) ) ) ;
state . orderedModifiers = orderedModifiers . filter ( function ( m ) {
return m . enabled ;
} ) ;
runModifierEffects ( ) ;
return instance . update ( ) ;
} ,
forceUpdate : function forceUpdate ( ) {
if ( isDestroyed ) {
return ;
}
var _state$elements = state . elements , reference3 = _state$elements . reference , popper3 = _state$elements . popper ;
if ( ! areValidElements ( reference3 , popper3 ) ) {
return ;
}
state . rects = {
reference : getCompositeRect ( reference3 , getOffsetParent ( popper3 ) , state . options . strategy === "fixed" ) ,
popper : getLayoutRect ( popper3 )
} ;
state . reset = false ;
state . placement = state . options . placement ;
state . orderedModifiers . forEach ( function ( modifier ) {
return state . modifiersData [ modifier . name ] = Object . assign ( { } , modifier . data ) ;
} ) ;
for ( var index = 0 ; index < state . orderedModifiers . length ; index ++ ) {
if ( state . reset === true ) {
state . reset = false ;
index = - 1 ;
continue ;
}
var _state$orderedModifie = state . orderedModifiers [ index ] , fn2 = _state$orderedModifie . fn , _state$orderedModifie2 = _state$orderedModifie . options , _options = _state$orderedModifie2 === void 0 ? { } : _state$orderedModifie2 , name = _state$orderedModifie . name ;
if ( typeof fn2 === "function" ) {
state = fn2 ( {
state ,
options : _options ,
name ,
instance
} ) || state ;
}
}
} ,
update : debounce ( function ( ) {
2023-09-05 17:29:16 +08:00
return new Promise ( function ( resolve ) {
2022-08-24 16:29:06 +08:00
instance . forceUpdate ( ) ;
2023-09-05 17:29:16 +08:00
resolve ( state ) ;
2022-08-24 16:29:06 +08:00
} ) ;
} ) ,
destroy : function destroy ( ) {
cleanupModifierEffects ( ) ;
isDestroyed = true ;
}
} ;
if ( ! areValidElements ( reference2 , popper2 ) ) {
return instance ;
}
instance . setOptions ( options ) . then ( function ( state2 ) {
if ( ! isDestroyed && options . onFirstUpdate ) {
options . onFirstUpdate ( state2 ) ;
}
} ) ;
function runModifierEffects ( ) {
2023-10-17 15:38:39 +08:00
state . orderedModifiers . forEach ( function ( _ref ) {
var name = _ref . name , _ref$options = _ref . options , options2 = _ref$options === void 0 ? { } : _ref$options , effect4 = _ref . effect ;
2022-08-24 16:29:06 +08:00
if ( typeof effect4 === "function" ) {
var cleanupFn = effect4 ( {
state ,
name ,
instance ,
options : options2
} ) ;
var noopFn = function noopFn2 ( ) {
} ;
effectCleanupFns . push ( cleanupFn || noopFn ) ;
}
} ) ;
}
function cleanupModifierEffects ( ) {
effectCleanupFns . forEach ( function ( fn2 ) {
return fn2 ( ) ;
} ) ;
effectCleanupFns = [ ] ;
}
return instance ;
} ;
}
2023-09-05 17:29:16 +08:00
// node_modules/@popperjs/core/lib/popper.js
2022-08-24 16:29:06 +08:00
var defaultModifiers = [ eventListeners _default , popperOffsets _default , computeStyles _default , applyStyles _default , offset _default , flip _default , preventOverflow _default , arrow _default , hide _default ] ;
var createPopper = /* @__PURE__ */ popperGenerator ( {
defaultModifiers
} ) ;
// src/settings/suggesters/suggest.ts
var wrapAround = ( value , size ) => {
return ( value % size + size ) % size ;
} ;
var Suggest = class {
constructor ( owner , containerEl , scope ) {
this . owner = owner ;
this . containerEl = containerEl ;
containerEl . on ( "click" , ".suggestion-item" , this . onSuggestionClick . bind ( this ) ) ;
containerEl . on ( "mousemove" , ".suggestion-item" , this . onSuggestionMouseover . bind ( this ) ) ;
scope . register ( [ ] , "ArrowUp" , ( event ) => {
if ( ! event . isComposing ) {
this . setSelectedItem ( this . selectedItem - 1 , true ) ;
return false ;
}
} ) ;
scope . register ( [ ] , "ArrowDown" , ( event ) => {
if ( ! event . isComposing ) {
this . setSelectedItem ( this . selectedItem + 1 , true ) ;
return false ;
}
} ) ;
scope . register ( [ ] , "Enter" , ( event ) => {
if ( ! event . isComposing ) {
this . useSelectedItem ( event ) ;
return false ;
}
} ) ;
}
onSuggestionClick ( event , el ) {
event . preventDefault ( ) ;
const item = this . suggestions . indexOf ( el ) ;
this . setSelectedItem ( item , false ) ;
this . useSelectedItem ( event ) ;
}
onSuggestionMouseover ( _event , el ) {
const item = this . suggestions . indexOf ( el ) ;
this . setSelectedItem ( item , false ) ;
}
setSuggestions ( values ) {
this . containerEl . empty ( ) ;
const suggestionEls = [ ] ;
values . forEach ( ( value ) => {
const suggestionEl = this . containerEl . createDiv ( "suggestion-item" ) ;
this . owner . renderSuggestion ( value , suggestionEl ) ;
suggestionEls . push ( suggestionEl ) ;
} ) ;
this . values = values ;
this . suggestions = suggestionEls ;
this . setSelectedItem ( 0 , false ) ;
}
useSelectedItem ( event ) {
const currentValue = this . values [ this . selectedItem ] ;
if ( currentValue ) {
this . owner . selectSuggestion ( currentValue , event ) ;
}
}
setSelectedItem ( selectedIndex , scrollIntoView ) {
const normalizedIndex = wrapAround ( selectedIndex , this . suggestions . length ) ;
const prevSelectedSuggestion = this . suggestions [ this . selectedItem ] ;
const selectedSuggestion = this . suggestions [ normalizedIndex ] ;
2023-09-05 17:29:16 +08:00
prevSelectedSuggestion ? . removeClass ( "is-selected" ) ;
selectedSuggestion ? . addClass ( "is-selected" ) ;
2022-08-24 16:29:06 +08:00
this . selectedItem = normalizedIndex ;
if ( scrollIntoView ) {
selectedSuggestion . scrollIntoView ( false ) ;
}
}
} ;
var TextInputSuggest = class {
2023-09-05 17:29:16 +08:00
constructor ( inputEl ) {
2022-08-24 16:29:06 +08:00
this . inputEl = inputEl ;
this . scope = new import _obsidian2 . Scope ( ) ;
this . suggestEl = createDiv ( "suggestion-container" ) ;
const suggestion = this . suggestEl . createDiv ( "suggestion" ) ;
this . suggest = new Suggest ( this , suggestion , this . scope ) ;
this . scope . register ( [ ] , "Escape" , this . close . bind ( this ) ) ;
this . inputEl . addEventListener ( "input" , this . onInputChanged . bind ( this ) ) ;
this . inputEl . addEventListener ( "focus" , this . onInputChanged . bind ( this ) ) ;
this . inputEl . addEventListener ( "blur" , this . close . bind ( this ) ) ;
this . suggestEl . on ( "mousedown" , ".suggestion-container" , ( event ) => {
event . preventDefault ( ) ;
} ) ;
}
onInputChanged ( ) {
const inputStr = this . inputEl . value ;
const suggestions = this . getSuggestions ( inputStr ) ;
if ( ! suggestions ) {
this . close ( ) ;
return ;
}
if ( suggestions . length > 0 ) {
this . suggest . setSuggestions ( suggestions ) ;
2023-09-05 17:29:16 +08:00
this . open ( app . dom . appContainerEl , this . inputEl ) ;
2022-08-24 16:29:06 +08:00
} else {
this . close ( ) ;
}
}
open ( container , inputEl ) {
2023-09-05 17:29:16 +08:00
app . keymap . pushScope ( this . scope ) ;
2022-08-24 16:29:06 +08:00
container . appendChild ( this . suggestEl ) ;
this . popper = createPopper ( inputEl , this . suggestEl , {
placement : "bottom-start" ,
modifiers : [
{
name : "sameWidth" ,
enabled : true ,
fn : ( { state , instance } ) => {
const targetWidth = ` ${ state . rects . reference . width } px ` ;
if ( state . styles . popper . width === targetWidth ) {
return ;
}
state . styles . popper . width = targetWidth ;
instance . update ( ) ;
} ,
phase : "beforeWrite" ,
requires : [ "computeStyles" ]
}
]
} ) ;
}
close ( ) {
2023-09-05 17:29:16 +08:00
app . keymap . popScope ( this . scope ) ;
2022-08-24 16:29:06 +08:00
this . suggest . setSuggestions ( [ ] ) ;
if ( this . popper )
this . popper . destroy ( ) ;
this . suggestEl . detach ( ) ;
}
} ;
// src/settings/suggesters/FolderSuggester.ts
var FolderSuggest = class extends TextInputSuggest {
getSuggestions ( inputStr ) {
2023-09-05 17:29:16 +08:00
const abstractFiles = app . vault . getAllLoadedFiles ( ) ;
2022-08-24 16:29:06 +08:00
const folders = [ ] ;
const lowerCaseInputStr = inputStr . toLowerCase ( ) ;
abstractFiles . forEach ( ( folder ) => {
if ( folder instanceof import _obsidian3 . TFolder && folder . path . toLowerCase ( ) . contains ( lowerCaseInputStr ) ) {
folders . push ( folder ) ;
}
} ) ;
return folders ;
}
renderSuggestion ( file , el ) {
el . setText ( file . path ) ;
}
selectSuggestion ( file ) {
this . inputEl . value = file . path ;
this . inputEl . trigger ( "input" ) ;
this . close ( ) ;
}
} ;
// src/settings/suggesters/FileSuggester.ts
var import _obsidian5 = _ _toModule ( require ( "obsidian" ) ) ;
// src/utils/Utils.ts
var import _obsidian4 = _ _toModule ( require ( "obsidian" ) ) ;
function delay ( ms ) {
2023-09-05 17:29:16 +08:00
return new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
2022-08-24 16:29:06 +08:00
}
function escape _RegExp ( str ) {
return str . replace ( /[.*+?^${}()|[\]\\]/g , "\\$&" ) ;
}
function generate _dynamic _command _regex ( ) {
return /(<%(?:-|_)?\s*[*~]{0,1})\+((?:.|\s)*?%>)/g ;
}
2023-09-05 17:29:16 +08:00
function resolve _tfolder ( folder _str ) {
2022-08-24 16:29:06 +08:00
folder _str = ( 0 , import _obsidian4 . normalizePath ) ( folder _str ) ;
const folder = app . vault . getAbstractFileByPath ( folder _str ) ;
if ( ! folder ) {
throw new TemplaterError ( ` Folder " ${ folder _str } " doesn't exist ` ) ;
}
if ( ! ( folder instanceof import _obsidian4 . TFolder ) ) {
throw new TemplaterError ( ` ${ folder _str } is a file, not a folder ` ) ;
}
return folder ;
}
2023-09-05 17:29:16 +08:00
function resolve _tfile ( file _str ) {
2022-08-24 16:29:06 +08:00
file _str = ( 0 , import _obsidian4 . normalizePath ) ( file _str ) ;
const file = app . vault . getAbstractFileByPath ( file _str ) ;
if ( ! file ) {
throw new TemplaterError ( ` File " ${ file _str } " doesn't exist ` ) ;
}
if ( ! ( file instanceof import _obsidian4 . TFile ) ) {
throw new TemplaterError ( ` ${ file _str } is a folder, not a file ` ) ;
}
return file ;
}
2023-09-05 17:29:16 +08:00
function get _tfiles _from _folder ( folder _str ) {
const folder = resolve _tfolder ( folder _str ) ;
2022-08-24 16:29:06 +08:00
const files = [ ] ;
import _obsidian4 . Vault . recurseChildren ( folder , ( file ) => {
if ( file instanceof import _obsidian4 . TFile ) {
files . push ( file ) ;
}
} ) ;
files . sort ( ( a , b ) => {
return a . basename . localeCompare ( b . basename ) ;
} ) ;
return files ;
}
function arraymove ( arr , fromIndex , toIndex ) {
if ( toIndex < 0 || toIndex === arr . length ) {
return ;
}
const element = arr [ fromIndex ] ;
arr [ fromIndex ] = arr [ toIndex ] ;
arr [ toIndex ] = element ;
}
2023-10-17 15:38:39 +08:00
function get _active _file ( app2 ) {
return app2 . workspace . activeEditor ? . file ? ? app2 . workspace . getActiveFile ( ) ;
}
2022-08-24 16:29:06 +08:00
// src/settings/suggesters/FileSuggester.ts
var FileSuggestMode ;
( function ( FileSuggestMode2 ) {
FileSuggestMode2 [ FileSuggestMode2 [ "TemplateFiles" ] = 0 ] = "TemplateFiles" ;
FileSuggestMode2 [ FileSuggestMode2 [ "ScriptFiles" ] = 1 ] = "ScriptFiles" ;
} ) ( FileSuggestMode || ( FileSuggestMode = { } ) ) ;
var FileSuggest = class extends TextInputSuggest {
2023-09-05 17:29:16 +08:00
constructor ( inputEl , plugin , mode ) {
super ( inputEl ) ;
2022-08-24 16:29:06 +08:00
this . inputEl = inputEl ;
this . plugin = plugin ;
this . mode = mode ;
}
get _folder ( mode ) {
switch ( mode ) {
case 0 :
return this . plugin . settings . templates _folder ;
case 1 :
return this . plugin . settings . user _scripts _folder ;
}
}
get _error _msg ( mode ) {
switch ( mode ) {
case 0 :
return ` Templates folder doesn't exist ` ;
case 1 :
return ` User Scripts folder doesn't exist ` ;
}
}
getSuggestions ( input _str ) {
2023-09-05 17:29:16 +08:00
const all _files = errorWrapperSync ( ( ) => get _tfiles _from _folder ( this . get _folder ( this . mode ) ) , this . get _error _msg ( this . mode ) ) ;
2022-08-24 16:29:06 +08:00
if ( ! all _files ) {
return [ ] ;
}
const files = [ ] ;
const lower _input _str = input _str . toLowerCase ( ) ;
all _files . forEach ( ( file ) => {
if ( file instanceof import _obsidian5 . TFile && file . extension === "md" && file . path . toLowerCase ( ) . contains ( lower _input _str ) ) {
files . push ( file ) ;
}
} ) ;
return files ;
}
renderSuggestion ( file , el ) {
el . setText ( file . path ) ;
}
selectSuggestion ( file ) {
this . inputEl . value = file . path ;
this . inputEl . trigger ( "input" ) ;
this . close ( ) ;
}
} ;
// src/settings/Settings.ts
var DEFAULT _SETTINGS = {
command _timeout : 5 ,
templates _folder : "" ,
templates _pairs : [ [ "" , "" ] ] ,
trigger _on _file _creation : false ,
auto _jump _to _cursor : false ,
enable _system _commands : false ,
shell _path : "" ,
user _scripts _folder : "" ,
enable _folder _templates : true ,
folder _templates : [ { folder : "" , template : "" } ] ,
syntax _highlighting : true ,
2023-10-17 15:38:39 +08:00
syntax _highlighting _mobile : false ,
2022-08-24 16:29:06 +08:00
enabled _templates _hotkeys : [ "" ] ,
2023-09-05 17:29:16 +08:00
startup _templates : [ "" ] ,
enable _ribbon _icon : true
2022-08-24 16:29:06 +08:00
} ;
var TemplaterSettingTab = class extends import _obsidian6 . PluginSettingTab {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
super ( app , plugin ) ;
this . plugin = plugin ;
}
display ( ) {
this . containerEl . empty ( ) ;
this . add _general _setting _header ( ) ;
this . add _template _folder _setting ( ) ;
this . add _internal _functions _setting ( ) ;
2023-10-17 15:38:39 +08:00
this . add _syntax _highlighting _settings ( ) ;
2022-08-24 16:29:06 +08:00
this . add _auto _jump _to _cursor ( ) ;
this . add _trigger _on _new _file _creation _setting ( ) ;
2023-09-05 17:29:16 +08:00
this . add _ribbon _icon _setting ( ) ;
2022-08-24 16:29:06 +08:00
this . add _templates _hotkeys _setting ( ) ;
if ( this . plugin . settings . trigger _on _file _creation ) {
this . add _folder _templates _setting ( ) ;
}
this . add _startup _templates _setting ( ) ;
this . add _user _script _functions _setting ( ) ;
this . add _user _system _command _functions _setting ( ) ;
2023-09-05 17:29:16 +08:00
this . add _donating _setting ( ) ;
2022-08-24 16:29:06 +08:00
}
add _general _setting _header ( ) {
this . containerEl . createEl ( "h2" , { text : "General Settings" } ) ;
}
add _template _folder _setting ( ) {
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Template folder location" ) . setDesc ( "Files in this folder will be available as templates." ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FolderSuggest ( cb . inputEl ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Example: folder1/folder2" ) . setValue ( this . plugin . settings . templates _folder ) . onChange ( ( new _folder ) => {
this . plugin . settings . templates _folder = new _folder ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) ;
}
add _internal _functions _setting ( ) {
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Templater provides multiples predefined variables / functions that you can use." , desc . createEl ( "br" ) , "Check the " , desc . createEl ( "a" , {
href : "https://silentvoid13.github.io/Templater/" ,
text : "documentation"
} ) , " to get a list of all the available internal variables / functions." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Internal Variables and Functions" ) . setDesc ( desc ) ;
}
2023-10-17 15:38:39 +08:00
add _syntax _highlighting _settings ( ) {
const desktopDesc = document . createDocumentFragment ( ) ;
desktopDesc . append ( "Adds syntax highlighting for Templater commands in edit mode." ) ;
const mobileDesc = document . createDocumentFragment ( ) ;
mobileDesc . append ( "Adds syntax highlighting for Templater commands in edit mode on mobile. Use with caution: this may break live preview on mobile platforms." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Syntax Highlighting on Desktop" ) . setDesc ( desktopDesc ) . addToggle ( ( toggle ) => {
2022-08-24 16:29:06 +08:00
toggle . setValue ( this . plugin . settings . syntax _highlighting ) . onChange ( ( syntax _highlighting ) => {
this . plugin . settings . syntax _highlighting = syntax _highlighting ;
this . plugin . save _settings ( ) ;
this . plugin . event _handler . update _syntax _highlighting ( ) ;
} ) ;
} ) ;
2023-10-17 15:38:39 +08:00
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Syntax Highlighting on Mobile" ) . setDesc ( mobileDesc ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . syntax _highlighting _mobile ) . onChange ( ( syntax _highlighting _mobile ) => {
this . plugin . settings . syntax _highlighting _mobile = syntax _highlighting _mobile ;
this . plugin . save _settings ( ) ;
this . plugin . event _handler . update _syntax _highlighting ( ) ;
} ) ;
} ) ;
2022-08-24 16:29:06 +08:00
}
add _auto _jump _to _cursor ( ) {
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Automatically triggers " , desc . createEl ( "code" , { text : "tp.file.cursor" } ) , " after inserting a template." , desc . createEl ( "br" ) , "You can also set a hotkey to manually trigger " , desc . createEl ( "code" , { text : "tp.file.cursor" } ) , "." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Automatic jump to cursor" ) . setDesc ( desc ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . auto _jump _to _cursor ) . onChange ( ( auto _jump _to _cursor ) => {
this . plugin . settings . auto _jump _to _cursor = auto _jump _to _cursor ;
this . plugin . save _settings ( ) ;
} ) ;
} ) ;
}
add _trigger _on _new _file _creation _setting ( ) {
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Templater will listen for the new file creation event, and replace every command it finds in the new file's content." , desc . createEl ( "br" ) , "This makes Templater compatible with other plugins like the Daily note core plugin, Calendar plugin, Review plugin, Note refactor plugin, ..." , desc . createEl ( "br" ) , desc . createEl ( "b" , {
text : "Warning: "
} ) , "This can be dangerous if you create new files with unknown / unsafe content on creation. Make sure that every new file's content is safe on creation." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Trigger Templater on new file creation" ) . setDesc ( desc ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . trigger _on _file _creation ) . onChange ( ( trigger _on _file _creation ) => {
this . plugin . settings . trigger _on _file _creation = trigger _on _file _creation ;
this . plugin . save _settings ( ) ;
this . plugin . event _handler . update _trigger _file _on _creation ( ) ;
this . display ( ) ;
} ) ;
} ) ;
}
2023-09-05 17:29:16 +08:00
add _ribbon _icon _setting ( ) {
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Show Templater icon in sidebar ribbon, allowing you to quickly use templates anywhere." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Show icon in sidebar" ) . setDesc ( desc ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . enable _ribbon _icon ) . onChange ( ( enable _ribbon _icon ) => {
this . plugin . settings . enable _ribbon _icon = enable _ribbon _icon ;
this . plugin . save _settings ( ) ;
if ( this . plugin . settings . enable _ribbon _icon ) {
this . plugin . addRibbonIcon ( "templater-icon" , "Templater" , async ( ) => {
this . plugin . fuzzy _suggester . insert _template ( ) ;
} ) . setAttribute ( "id" , "rb-templater-icon" ) ;
} else {
document . getElementById ( "rb-templater-icon" ) ? . remove ( ) ;
}
} ) ;
} ) ;
}
2022-08-24 16:29:06 +08:00
add _templates _hotkeys _setting ( ) {
this . containerEl . createEl ( "h2" , { text : "Template Hotkeys" } ) ;
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Template Hotkeys allows you to bind a template to a hotkey." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setDesc ( desc ) ;
this . plugin . settings . enabled _templates _hotkeys . forEach ( ( template , index ) => {
const s = new import _obsidian6 . Setting ( this . containerEl ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FileSuggest ( cb . inputEl , this . plugin , FileSuggestMode . TemplateFiles ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Example: folder1/template_file" ) . setValue ( template ) . onChange ( ( new _template ) => {
if ( new _template && this . plugin . settings . enabled _templates _hotkeys . contains ( new _template ) ) {
log _error ( new TemplaterError ( "This template is already bound to a hotkey" ) ) ;
return ;
}
this . plugin . command _handler . add _template _hotkey ( this . plugin . settings . enabled _templates _hotkeys [ index ] , new _template ) ;
this . plugin . settings . enabled _templates _hotkeys [ index ] = new _template ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "any-key" ) . setTooltip ( "Configure Hotkey" ) . onClick ( ( ) => {
2023-09-05 17:29:16 +08:00
app . setting . openTabById ( "hotkeys" ) ;
const tab = app . setting . activeTab ;
2022-08-24 16:29:06 +08:00
tab . searchInputEl . value = "Templater: Insert" ;
tab . updateHotkeyVisibility ( ) ;
} ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "up-chevron-glyph" ) . setTooltip ( "Move up" ) . onClick ( ( ) => {
arraymove ( this . plugin . settings . enabled _templates _hotkeys , index , index - 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "down-chevron-glyph" ) . setTooltip ( "Move down" ) . onClick ( ( ) => {
arraymove ( this . plugin . settings . enabled _templates _hotkeys , index , index + 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "cross" ) . setTooltip ( "Delete" ) . onClick ( ( ) => {
this . plugin . command _handler . remove _template _hotkey ( this . plugin . settings . enabled _templates _hotkeys [ index ] ) ;
this . plugin . settings . enabled _templates _hotkeys . splice ( index , 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
s . infoEl . remove ( ) ;
} ) ;
new import _obsidian6 . Setting ( this . containerEl ) . addButton ( ( cb ) => {
cb . setButtonText ( "Add new hotkey for template" ) . setCta ( ) . onClick ( ( ) => {
this . plugin . settings . enabled _templates _hotkeys . push ( "" ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
}
add _folder _templates _setting ( ) {
this . containerEl . createEl ( "h2" , { text : "Folder Templates" } ) ;
const descHeading = document . createDocumentFragment ( ) ;
descHeading . append ( "Folder Templates are triggered when a new " , descHeading . createEl ( "strong" , { text : "empty " } ) , "file is created in a given folder." , descHeading . createEl ( "br" ) , "Templater will fill the empty file with the specified template." , descHeading . createEl ( "br" ) , "The deepest match is used. A global default template would be defined on the root " , descHeading . createEl ( "code" , { text : "/" } ) , "." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setDesc ( descHeading ) ;
const descUseNewFileTemplate = document . createDocumentFragment ( ) ;
descUseNewFileTemplate . append ( "When enabled Templater will make use of the folder templates defined below." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Enable Folder Templates" ) . setDesc ( descUseNewFileTemplate ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . enable _folder _templates ) . onChange ( ( use _new _file _templates ) => {
this . plugin . settings . enable _folder _templates = use _new _file _templates ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
if ( ! this . plugin . settings . enable _folder _templates ) {
return ;
}
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Add New" ) . setDesc ( "Add new folder template" ) . addButton ( ( button ) => {
button . setTooltip ( "Add additional folder template" ) . setButtonText ( "+" ) . setCta ( ) . onClick ( ( ) => {
this . plugin . settings . folder _templates . push ( {
folder : "" ,
template : ""
} ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
this . plugin . settings . folder _templates . forEach ( ( folder _template , index ) => {
const s = new import _obsidian6 . Setting ( this . containerEl ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FolderSuggest ( cb . inputEl ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Folder" ) . setValue ( folder _template . folder ) . onChange ( ( new _folder ) => {
if ( new _folder && this . plugin . settings . folder _templates . some ( ( e ) => e . folder == new _folder ) ) {
log _error ( new TemplaterError ( "This folder already has a template associated with it" ) ) ;
return ;
}
this . plugin . settings . folder _templates [ index ] . folder = new _folder ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FileSuggest ( cb . inputEl , this . plugin , FileSuggestMode . TemplateFiles ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Template" ) . setValue ( folder _template . template ) . onChange ( ( new _template ) => {
this . plugin . settings . folder _templates [ index ] . template = new _template ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "up-chevron-glyph" ) . setTooltip ( "Move up" ) . onClick ( ( ) => {
arraymove ( this . plugin . settings . folder _templates , index , index - 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "down-chevron-glyph" ) . setTooltip ( "Move down" ) . onClick ( ( ) => {
arraymove ( this . plugin . settings . folder _templates , index , index + 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "cross" ) . setTooltip ( "Delete" ) . onClick ( ( ) => {
this . plugin . settings . folder _templates . splice ( index , 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
s . infoEl . remove ( ) ;
} ) ;
}
add _startup _templates _setting ( ) {
this . containerEl . createEl ( "h2" , { text : "Startup Templates" } ) ;
const desc = document . createDocumentFragment ( ) ;
desc . append ( "Startup Templates are templates that will get executed once when Templater starts." , desc . createEl ( "br" ) , "These templates won't output anything." , desc . createEl ( "br" ) , "This can be useful to set up templates adding hooks to obsidian events for example." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setDesc ( desc ) ;
this . plugin . settings . startup _templates . forEach ( ( template , index ) => {
const s = new import _obsidian6 . Setting ( this . containerEl ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FileSuggest ( cb . inputEl , this . plugin , FileSuggestMode . TemplateFiles ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Example: folder1/template_file" ) . setValue ( template ) . onChange ( ( new _template ) => {
if ( new _template && this . plugin . settings . startup _templates . contains ( new _template ) ) {
log _error ( new TemplaterError ( "This startup template already exist" ) ) ;
return ;
}
this . plugin . settings . startup _templates [ index ] = new _template ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) . addExtraButton ( ( cb ) => {
cb . setIcon ( "cross" ) . setTooltip ( "Delete" ) . onClick ( ( ) => {
this . plugin . settings . startup _templates . splice ( index , 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
s . infoEl . remove ( ) ;
} ) ;
new import _obsidian6 . Setting ( this . containerEl ) . addButton ( ( cb ) => {
cb . setButtonText ( "Add new startup template" ) . setCta ( ) . onClick ( ( ) => {
this . plugin . settings . startup _templates . push ( "" ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
}
add _user _script _functions _setting ( ) {
this . containerEl . createEl ( "h2" , { text : "User Script Functions" } ) ;
let desc = document . createDocumentFragment ( ) ;
desc . append ( "All JavaScript files in this folder will be loaded as CommonJS modules, to import custom user functions." , desc . createEl ( "br" ) , "The folder needs to be accessible from the vault." , desc . createEl ( "br" ) , "Check the " , desc . createEl ( "a" , {
href : "https://silentvoid13.github.io/Templater/" ,
text : "documentation"
} ) , " for more information." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Script files folder location" ) . setDesc ( desc ) . addSearch ( ( cb ) => {
2023-09-05 17:29:16 +08:00
new FolderSuggest ( cb . inputEl ) ;
2022-08-24 16:29:06 +08:00
cb . setPlaceholder ( "Example: folder1/folder2" ) . setValue ( this . plugin . settings . user _scripts _folder ) . onChange ( ( new _folder ) => {
this . plugin . settings . user _scripts _folder = new _folder ;
this . plugin . save _settings ( ) ;
} ) ;
cb . containerEl . addClass ( "templater_search" ) ;
} ) ;
desc = document . createDocumentFragment ( ) ;
let name ;
if ( ! this . plugin . settings . user _scripts _folder ) {
name = "No User Scripts folder set" ;
} else {
2023-09-05 17:29:16 +08:00
const files = errorWrapperSync ( ( ) => get _tfiles _from _folder ( this . plugin . settings . user _scripts _folder ) , ` User Scripts folder doesn't exist ` ) ;
2022-08-24 16:29:06 +08:00
if ( ! files || files . length === 0 ) {
name = "No User Scripts detected" ;
} else {
let count = 0 ;
for ( const file of files ) {
if ( file . extension === "js" ) {
count ++ ;
desc . append ( desc . createEl ( "li" , {
text : ` tp.user. ${ file . basename } `
} ) ) ;
}
}
name = ` Detected ${ count } User Script(s) ` ;
}
}
new import _obsidian6 . Setting ( this . containerEl ) . setName ( name ) . setDesc ( desc ) . addExtraButton ( ( extra ) => {
extra . setIcon ( "sync" ) . setTooltip ( "Refresh" ) . onClick ( ( ) => {
this . display ( ) ;
} ) ;
} ) ;
}
add _user _system _command _functions _setting ( ) {
let desc = document . createDocumentFragment ( ) ;
desc . append ( "Allows you to create user functions linked to system commands." , desc . createEl ( "br" ) , desc . createEl ( "b" , {
text : "Warning: "
} ) , "It can be dangerous to execute arbitrary system commands from untrusted sources. Only run system commands that you understand, from trusted sources." ) ;
this . containerEl . createEl ( "h2" , {
text : "User System Command Functions"
} ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Enable User System Command Functions" ) . setDesc ( desc ) . addToggle ( ( toggle ) => {
toggle . setValue ( this . plugin . settings . enable _system _commands ) . onChange ( ( enable _system _commands ) => {
this . plugin . settings . enable _system _commands = enable _system _commands ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
if ( this . plugin . settings . enable _system _commands ) {
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Timeout" ) . setDesc ( "Maximum timeout in seconds for a system command." ) . addText ( ( text ) => {
text . setPlaceholder ( "Timeout" ) . setValue ( this . plugin . settings . command _timeout . toString ( ) ) . onChange ( ( new _value ) => {
const new _timeout = Number ( new _value ) ;
if ( isNaN ( new _timeout ) ) {
log _error ( new TemplaterError ( "Timeout must be a number" ) ) ;
return ;
}
this . plugin . settings . command _timeout = new _timeout ;
this . plugin . save _settings ( ) ;
} ) ;
} ) ;
desc = document . createDocumentFragment ( ) ;
desc . append ( "Full path to the shell binary to execute the command with." , desc . createEl ( "br" ) , "This setting is optional and will default to the system's default shell if not specified." , desc . createEl ( "br" ) , "You can use forward slashes ('/') as path separators on all platforms if in doubt." ) ;
new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Shell binary location" ) . setDesc ( desc ) . addText ( ( text ) => {
text . setPlaceholder ( "Example: /bin/bash, ..." ) . setValue ( this . plugin . settings . shell _path ) . onChange ( ( shell _path ) => {
this . plugin . settings . shell _path = shell _path ;
this . plugin . save _settings ( ) ;
} ) ;
} ) ;
let i = 1 ;
this . plugin . settings . templates _pairs . forEach ( ( template _pair ) => {
const div2 = this . containerEl . createEl ( "div" ) ;
div2 . addClass ( "templater_div" ) ;
const title = this . containerEl . createEl ( "h4" , {
text : "User Function n\xB0" + i
} ) ;
title . addClass ( "templater_title" ) ;
const setting2 = new import _obsidian6 . Setting ( this . containerEl ) . addExtraButton ( ( extra ) => {
extra . setIcon ( "cross" ) . setTooltip ( "Delete" ) . onClick ( ( ) => {
const index = this . plugin . settings . templates _pairs . indexOf ( template _pair ) ;
if ( index > - 1 ) {
this . plugin . settings . templates _pairs . splice ( index , 1 ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
}
} ) ;
} ) . addText ( ( text ) => {
const t = text . setPlaceholder ( "Function name" ) . setValue ( template _pair [ 0 ] ) . onChange ( ( new _value ) => {
const index = this . plugin . settings . templates _pairs . indexOf ( template _pair ) ;
if ( index > - 1 ) {
this . plugin . settings . templates _pairs [ index ] [ 0 ] = new _value ;
this . plugin . save _settings ( ) ;
}
} ) ;
t . inputEl . addClass ( "templater_template" ) ;
return t ;
} ) . addTextArea ( ( text ) => {
const t = text . setPlaceholder ( "System Command" ) . setValue ( template _pair [ 1 ] ) . onChange ( ( new _cmd ) => {
const index = this . plugin . settings . templates _pairs . indexOf ( template _pair ) ;
if ( index > - 1 ) {
this . plugin . settings . templates _pairs [ index ] [ 1 ] = new _cmd ;
this . plugin . save _settings ( ) ;
}
} ) ;
t . inputEl . setAttr ( "rows" , 2 ) ;
t . inputEl . addClass ( "templater_cmd" ) ;
return t ;
} ) ;
setting2 . infoEl . remove ( ) ;
div2 . appendChild ( title ) ;
div2 . appendChild ( this . containerEl . lastChild ) ;
i += 1 ;
} ) ;
const div = this . containerEl . createEl ( "div" ) ;
div . addClass ( "templater_div2" ) ;
const setting = new import _obsidian6 . Setting ( this . containerEl ) . addButton ( ( button ) => {
button . setButtonText ( "Add New User Function" ) . setCta ( ) . onClick ( ( ) => {
this . plugin . settings . templates _pairs . push ( [ "" , "" ] ) ;
this . plugin . save _settings ( ) ;
this . display ( ) ;
} ) ;
} ) ;
setting . infoEl . remove ( ) ;
div . appendChild ( this . containerEl . lastChild ) ;
}
}
2023-09-05 17:29:16 +08:00
add _donating _setting ( ) {
const s = new import _obsidian6 . Setting ( this . containerEl ) . setName ( "Donate" ) . setDesc ( "If you like this Plugin, consider donating to support continued development." ) ;
const a1 = document . createElement ( "a" ) ;
a1 . setAttribute ( "href" , "https://github.com/sponsors/silentvoid13" ) ;
a1 . addClass ( "templater_donating" ) ;
const img1 = document . createElement ( "img" ) ;
img1 . src = "https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86" ;
a1 . appendChild ( img1 ) ;
const a2 = document . createElement ( "a" ) ;
a2 . setAttribute ( "href" , "https://www.paypal.com/donate?hosted_button_id=U2SRGAFYXT32Q" ) ;
a2 . addClass ( "templater_donating" ) ;
const img2 = document . createElement ( "img" ) ;
img2 . src = "https://img.shields.io/badge/paypal-silentvoid13-yellow?style=social&logo=paypal" ;
a2 . appendChild ( img2 ) ;
s . settingEl . appendChild ( a1 ) ;
s . settingEl . appendChild ( a2 ) ;
}
2022-08-24 16:29:06 +08:00
} ;
// src/handlers/FuzzySuggester.ts
var import _obsidian7 = _ _toModule ( require ( "obsidian" ) ) ;
var OpenMode ;
( function ( OpenMode2 ) {
OpenMode2 [ OpenMode2 [ "InsertTemplate" ] = 0 ] = "InsertTemplate" ;
OpenMode2 [ OpenMode2 [ "CreateNoteTemplate" ] = 1 ] = "CreateNoteTemplate" ;
} ) ( OpenMode || ( OpenMode = { } ) ) ;
var FuzzySuggester = class extends import _obsidian7 . FuzzySuggestModal {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
super ( app ) ;
this . plugin = plugin ;
this . setPlaceholder ( "Type name of a template..." ) ;
}
getItems ( ) {
if ( ! this . plugin . settings . templates _folder ) {
2023-09-05 17:29:16 +08:00
return app . vault . getMarkdownFiles ( ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const files = errorWrapperSync ( ( ) => get _tfiles _from _folder ( this . plugin . settings . templates _folder ) , ` Couldn't retrieve template files from templates folder ${ this . plugin . settings . templates _folder } ` ) ;
2022-08-24 16:29:06 +08:00
if ( ! files ) {
return [ ] ;
}
return files ;
}
getItemText ( item ) {
return item . basename ;
}
onChooseItem ( item ) {
switch ( this . open _mode ) {
case 0 :
this . plugin . templater . append _template _to _active _file ( item ) ;
break ;
case 1 :
this . plugin . templater . create _new _note _from _template ( item , this . creation _folder ) ;
break ;
}
}
start ( ) {
try {
this . open ( ) ;
} catch ( e ) {
log _error ( e ) ;
}
}
insert _template ( ) {
this . open _mode = 0 ;
this . start ( ) ;
}
create _new _note _from _template ( folder ) {
this . creation _folder = folder ;
this . open _mode = 1 ;
this . start ( ) ;
}
} ;
// src/utils/Constants.ts
var UNSUPPORTED _MOBILE _TEMPLATE = "Error_MobileUnsupportedTemplate" ;
var ICON _DATA = ` <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 51.1328 28.7"><path d="M0 15.14 0 10.15 18.67 1.51 18.67 6.03 4.72 12.33 4.72 12.76 18.67 19.22 18.67 23.74 0 15.14ZM33.6928 1.84C33.6928 1.84 33.9761 2.1467 34.5428 2.76C35.1094 3.38 35.3928 4.56 35.3928 6.3C35.3928 8.0466 34.8195 9.54 33.6728 10.78C32.5261 12.02 31.0995 12.64 29.3928 12.64C27.6862 12.64 26.2661 12.0267 25.1328 10.8C23.9928 9.5733 23.4228 8.0867 23.4228 6.34C23.4228 4.6 23.9995 3.1066 25.1528 1.86C26.2994.62 27.7261 0 29.4328 0C31.1395 0 32.5594.6133 33.6928 1.84M49.8228.67 29.5328 28.38 24.4128 28.38 44.7128.67 49.8228.67M31.0328 8.38C31.0328 8.38 31.1395 8.2467 31.3528 7.98C31.5662 7.7067 31.6728 7.1733 31.6728 6.38C31.6728 5.5867 31.4461 4.92 30.9928 4.38C30.5461 3.84 29.9995 3.57 29.3528 3.57C28.7061 3.57 28.1695 3.84 27.7428 4.38C27.3228 4.92 27.1128 5.5867 27.1128 6.38C27.1128 7.1733 27.3361 7.84 27.7828 8.38C28.2361 8.9267 28.7861 9.2 29.4328 9.2C30.0795 9.2 30.6128 8.9267 31.0328 8.38M49.4328 17.9C49.4328 17.9 49.7161 18.2067 50.2828 18.82C50.8495 19.4333 51.1328 20.6133 51.1328 22.36C51.1328 24.1 50.5594 25.59 49.4128 26.83C48.2595 28.0766 46.8295 28.7 45.1228 28.7C43.4228 28.7 42.0028 28.0833 40.8628 26.85C39.7295 25.6233 39.1628 24.1366 39.1628 22.39C39.1628 20.65 39.7361 19.16 40.8828 17.92C42.0361 16.6733 43.4628 16.05 45.1628 16.05C46.8694 16.05 48.2928 16.6667 49.4328 17.9M46.8528 24.52C46.8528 24.52 46.9595 24.3833 47.1728 24.11C47.3795 23.8367 47.4828 23.3033 47.4828 22.51C47.4828 21.7167 47.2595 21.05 46.8128 20.51C46.3661 19.97 45.8162 19.7 45.1628 19.7C44.5161 19.7 43.9828 19.97 43.5628 20.51C43.1428 21.05 42.9328 21.7167 42.9328 22.51C42.9328 23.3033 43.1561 23.9733 43.6028 24.52C44.0494 25.06 44.5961 25.33 45.2428 25.33C45.8895 25.33 46.4261 25.06 46.8528 24.52Z" fill="currentColor"/></svg> ` ;
// src/core/Templater.ts
2023-11-10 10:46:38 +08:00
var import _obsidian12 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
// src/core/functions/internal_functions/InternalModule.ts
var InternalModule = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
this . static _functions = new Map ( ) ;
this . dynamic _functions = new Map ( ) ;
}
getName ( ) {
return this . name ;
}
2023-09-05 17:29:16 +08:00
async init ( ) {
await this . create _static _templates ( ) ;
this . static _object = Object . fromEntries ( this . static _functions ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async generate _object ( new _config ) {
this . config = new _config ;
await this . create _dynamic _templates ( ) ;
return {
... this . static _object ,
... Object . fromEntries ( this . dynamic _functions )
} ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/date/InternalModuleDate.ts
var InternalModuleDate = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "date" ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
this . static _functions . set ( "now" , this . generate _now ( ) ) ;
this . static _functions . set ( "tomorrow" , this . generate _tomorrow ( ) ) ;
this . static _functions . set ( "weekday" , this . generate _weekday ( ) ) ;
this . static _functions . set ( "yesterday" , this . generate _yesterday ( ) ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async create _dynamic _templates ( ) {
2022-08-24 16:29:06 +08:00
}
generate _now ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD" , offset2 , reference2 , reference _format ) => {
2022-08-24 16:29:06 +08:00
if ( reference2 && ! window . moment ( reference2 , reference _format ) . isValid ( ) ) {
throw new TemplaterError ( "Invalid reference date format, try specifying one with the argument 'reference_format'" ) ;
}
let duration ;
if ( typeof offset2 === "string" ) {
duration = window . moment . duration ( offset2 ) ;
} else if ( typeof offset2 === "number" ) {
duration = window . moment . duration ( offset2 , "days" ) ;
}
2023-10-17 15:38:39 +08:00
return window . moment ( reference2 , reference _format ) . add ( duration ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _tomorrow ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD" ) => {
return window . moment ( ) . add ( 1 , "days" ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _weekday ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD" , weekday , reference2 , reference _format ) => {
2022-08-24 16:29:06 +08:00
if ( reference2 && ! window . moment ( reference2 , reference _format ) . isValid ( ) ) {
throw new TemplaterError ( "Invalid reference date format, try specifying one with the argument 'reference_format'" ) ;
}
2023-10-17 15:38:39 +08:00
return window . moment ( reference2 , reference _format ) . weekday ( weekday ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _yesterday ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD" ) => {
return window . moment ( ) . add ( - 1 , "days" ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
} ;
// src/core/functions/internal_functions/file/InternalModuleFile.ts
var import _obsidian8 = _ _toModule ( require ( "obsidian" ) ) ;
var DEPTH _LIMIT = 10 ;
var InternalModuleFile = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "file" ;
this . include _depth = 0 ;
this . create _new _depth = 0 ;
this . linkpath _regex = new RegExp ( "^\\[\\[(.*)\\]\\]$" ) ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
this . static _functions . set ( "creation_date" , this . generate _creation _date ( ) ) ;
this . static _functions . set ( "create_new" , this . generate _create _new ( ) ) ;
this . static _functions . set ( "cursor" , this . generate _cursor ( ) ) ;
this . static _functions . set ( "cursor_append" , this . generate _cursor _append ( ) ) ;
this . static _functions . set ( "exists" , this . generate _exists ( ) ) ;
this . static _functions . set ( "find_tfile" , this . generate _find _tfile ( ) ) ;
this . static _functions . set ( "folder" , this . generate _folder ( ) ) ;
this . static _functions . set ( "include" , this . generate _include ( ) ) ;
this . static _functions . set ( "last_modified_date" , this . generate _last _modified _date ( ) ) ;
this . static _functions . set ( "move" , this . generate _move ( ) ) ;
this . static _functions . set ( "path" , this . generate _path ( ) ) ;
this . static _functions . set ( "rename" , this . generate _rename ( ) ) ;
this . static _functions . set ( "selection" , this . generate _selection ( ) ) ;
}
async create _dynamic _templates ( ) {
this . dynamic _functions . set ( "content" , await this . generate _content ( ) ) ;
this . dynamic _functions . set ( "tags" , this . generate _tags ( ) ) ;
this . dynamic _functions . set ( "title" , this . generate _title ( ) ) ;
}
async generate _content ( ) {
return await app . vault . read ( this . config . target _file ) ;
2022-08-24 16:29:06 +08:00
}
generate _create _new ( ) {
2023-09-05 17:29:16 +08:00
return async ( template , filename , open _new = false , folder ) => {
2022-08-24 16:29:06 +08:00
this . create _new _depth += 1 ;
if ( this . create _new _depth > DEPTH _LIMIT ) {
this . create _new _depth = 0 ;
throw new TemplaterError ( "Reached create_new depth limit (max = 10)" ) ;
}
2023-09-05 17:29:16 +08:00
const new _file = await this . plugin . templater . create _new _note _from _template ( template , folder , filename , open _new ) ;
2022-08-24 16:29:06 +08:00
this . create _new _depth -= 1 ;
return new _file ;
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
generate _creation _date ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD HH:mm" ) => {
return window . moment ( this . config . target _file . stat . ctime ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _cursor ( ) {
return ( order2 ) => {
2023-09-05 17:29:16 +08:00
return ` <% tp.file.cursor( ${ order2 ? ? "" } ) %> ` ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _cursor _append ( ) {
return ( content ) => {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . editor ) {
log _error ( new TemplaterError ( "No active editor, can't append to cursor." ) ) ;
2022-08-24 16:29:06 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
const editor = active _editor . editor ;
2022-08-24 16:29:06 +08:00
const doc = editor . getDoc ( ) ;
doc . replaceSelection ( content ) ;
return "" ;
} ;
}
generate _exists ( ) {
2023-09-05 17:29:16 +08:00
return async ( filename ) => {
const path = ( 0 , import _obsidian8 . normalizePath ) ( filename ) ;
return await app . vault . exists ( path ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _find _tfile ( ) {
return ( filename ) => {
const path = ( 0 , import _obsidian8 . normalizePath ) ( filename ) ;
2023-09-05 17:29:16 +08:00
return app . metadataCache . getFirstLinkpathDest ( path , "" ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _folder ( ) {
return ( relative = false ) => {
const parent = this . config . target _file . parent ;
let folder ;
if ( relative ) {
folder = parent . path ;
} else {
folder = parent . name ;
}
return folder ;
} ;
}
generate _include ( ) {
2023-09-05 17:29:16 +08:00
return async ( include _link ) => {
2022-08-24 16:29:06 +08:00
this . include _depth += 1 ;
if ( this . include _depth > DEPTH _LIMIT ) {
this . include _depth -= 1 ;
throw new TemplaterError ( "Reached inclusion depth limit (max = 10)" ) ;
}
let inc _file _content ;
if ( include _link instanceof import _obsidian8 . TFile ) {
2023-09-05 17:29:16 +08:00
inc _file _content = await app . vault . read ( include _link ) ;
2022-08-24 16:29:06 +08:00
} else {
let match ;
if ( ( match = this . linkpath _regex . exec ( include _link ) ) === null ) {
this . include _depth -= 1 ;
throw new TemplaterError ( "Invalid file format, provide an obsidian link between quotes." ) ;
}
const { path , subpath } = ( 0 , import _obsidian8 . parseLinktext ) ( match [ 1 ] ) ;
2023-09-05 17:29:16 +08:00
const inc _file = app . metadataCache . getFirstLinkpathDest ( path , "" ) ;
2022-08-24 16:29:06 +08:00
if ( ! inc _file ) {
this . include _depth -= 1 ;
throw new TemplaterError ( ` File ${ include _link } doesn't exist ` ) ;
}
2023-09-05 17:29:16 +08:00
inc _file _content = await app . vault . read ( inc _file ) ;
2022-08-24 16:29:06 +08:00
if ( subpath ) {
2023-09-05 17:29:16 +08:00
const cache = app . metadataCache . getFileCache ( inc _file ) ;
2022-08-24 16:29:06 +08:00
if ( cache ) {
const result = ( 0 , import _obsidian8 . resolveSubpath ) ( cache , subpath ) ;
if ( result ) {
2023-09-05 17:29:16 +08:00
inc _file _content = inc _file _content . slice ( result . start . offset , result . end ? . offset ) ;
2022-08-24 16:29:06 +08:00
}
}
}
}
try {
2023-09-05 17:29:16 +08:00
const parsed _content = await this . plugin . templater . parser . parse _commands ( inc _file _content , this . plugin . templater . current _functions _object ) ;
2022-08-24 16:29:06 +08:00
this . include _depth -= 1 ;
return parsed _content ;
} catch ( e ) {
this . include _depth -= 1 ;
throw e ;
}
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
generate _last _modified _date ( ) {
2023-10-17 15:38:39 +08:00
return ( format = "YYYY-MM-DD HH:mm" ) => {
return window . moment ( this . config . target _file . stat . mtime ) . format ( format ) ;
2022-08-24 16:29:06 +08:00
} ;
}
generate _move ( ) {
2023-09-05 17:29:16 +08:00
return async ( path , file _to _move ) => {
const file = file _to _move || this . config . target _file ;
const new _path = ( 0 , import _obsidian8 . normalizePath ) ( ` ${ path } . ${ file . extension } ` ) ;
const dirs = new _path . replace ( /\\/g , "/" ) . split ( "/" ) ;
dirs . pop ( ) ;
if ( dirs . length ) {
const dir = dirs . join ( "/" ) ;
if ( ! window . app . vault . getAbstractFileByPath ( dir ) ) {
await window . app . vault . createFolder ( dir ) ;
}
}
await app . fileManager . renameFile ( file , new _path ) ;
2022-08-24 16:29:06 +08:00
return "" ;
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
generate _path ( ) {
return ( relative = false ) => {
2023-09-05 17:29:16 +08:00
let vault _path = "" ;
2022-08-24 16:29:06 +08:00
if ( import _obsidian8 . Platform . isMobileApp ) {
2023-09-05 17:29:16 +08:00
const vault _adapter = app . vault . adapter . fs . uri ;
const vault _base = app . vault . adapter . basePath ;
vault _path = ` ${ vault _adapter } / ${ vault _base } ` ;
} else {
if ( app . vault . adapter instanceof import _obsidian8 . FileSystemAdapter ) {
vault _path = app . vault . adapter . getBasePath ( ) ;
} else {
throw new TemplaterError ( "app.vault is not a FileSystemAdapter instance" ) ;
}
2022-08-24 16:29:06 +08:00
}
if ( relative ) {
return this . config . target _file . path ;
} else {
return ` ${ vault _path } / ${ this . config . target _file . path } ` ;
}
} ;
}
generate _rename ( ) {
2023-09-05 17:29:16 +08:00
return async ( new _title ) => {
2022-08-24 16:29:06 +08:00
if ( new _title . match ( /[\\/:]+/g ) ) {
throw new TemplaterError ( "File name cannot contain any of these characters: \\ / :" ) ;
}
const new _path = ( 0 , import _obsidian8 . normalizePath ) ( ` ${ this . config . target _file . parent . path } / ${ new _title } . ${ this . config . target _file . extension } ` ) ;
2023-09-05 17:29:16 +08:00
await app . fileManager . renameFile ( this . config . target _file , new _path ) ;
2022-08-24 16:29:06 +08:00
return "" ;
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
generate _selection ( ) {
return ( ) => {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . editor ) {
throw new TemplaterError ( "Active editor is null, can't read selection." ) ;
2022-08-24 16:29:06 +08:00
}
2023-10-17 15:38:39 +08:00
const editor = active _editor . editor ;
2022-08-24 16:29:06 +08:00
return editor . getSelection ( ) ;
} ;
}
generate _tags ( ) {
2023-09-05 17:29:16 +08:00
const cache = app . metadataCache . getFileCache ( this . config . target _file ) ;
if ( cache ) {
return ( 0 , import _obsidian8 . getAllTags ) ( cache ) ;
}
return null ;
2022-08-24 16:29:06 +08:00
}
generate _title ( ) {
return this . config . target _file . basename ;
}
} ;
// src/core/functions/internal_functions/web/InternalModuleWeb.ts
var InternalModuleWeb = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "web" ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
this . static _functions . set ( "daily_quote" , this . generate _daily _quote ( ) ) ;
this . static _functions . set ( "random_picture" , this . generate _random _picture ( ) ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async create _dynamic _templates ( ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async getRequest ( url ) {
try {
const response = await fetch ( url ) ;
2022-08-24 16:29:06 +08:00
if ( ! response . ok ) {
throw new TemplaterError ( "Error performing GET request" ) ;
}
return response ;
2023-09-05 17:29:16 +08:00
} catch ( error ) {
throw new TemplaterError ( "Error performing GET request" ) ;
}
2022-08-24 16:29:06 +08:00
}
generate _daily _quote ( ) {
2023-09-05 17:29:16 +08:00
return async ( ) => {
try {
const response = await this . getRequest ( "https://api.quotable.io/random" ) ;
const json = await response . json ( ) ;
const author = json . author ;
const quote = json . content ;
const new _content = ` > ${ quote }
> \u2014 < cite > $ { author } < / c i t e > ` ;
return new _content ;
} catch ( error ) {
new TemplaterError ( "Error generating daily quote" ) ;
return "Error generating daily quote" ;
}
} ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
generate _random _picture ( ) {
return async ( size , query , include _size = false ) => {
try {
const response = await this . getRequest ( ` https://templater-unsplash.fly.dev/ ${ query ? "?q=" + query : "" } ` ) . then ( ( res ) => res . json ( ) ) ;
let url = response . full ;
if ( size && ! include _size ) {
if ( size . includes ( "x" ) ) {
const [ width , height ] = size . split ( "x" ) ;
url = url . concat ( ` &w= ${ width } &h= ${ height } ` ) ;
} else {
url = url . concat ( ` &w= ${ size } ` ) ;
}
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
if ( include _size ) {
return ` ![photo by ${ response . photog } on Unsplash| ${ size } ]( ${ url } ) ` ;
}
return ` ![photo by ${ response . photog } on Unsplash]( ${ url } ) ` ;
} catch ( error ) {
new TemplaterError ( "Error generating random picture" ) ;
return "Error generating random picture" ;
}
} ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/frontmatter/InternalModuleFrontmatter.ts
var InternalModuleFrontmatter = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "frontmatter" ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async create _dynamic _templates ( ) {
const cache = app . metadataCache . getFileCache ( this . config . target _file ) ;
this . dynamic _functions = new Map ( Object . entries ( cache ? . frontmatter || { } ) ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/system/PromptModal.ts
var import _obsidian9 = _ _toModule ( require ( "obsidian" ) ) ;
var PromptModal = class extends import _obsidian9 . Modal {
2023-09-05 17:29:16 +08:00
constructor ( prompt _text , default _value , multi _line ) {
2022-08-24 16:29:06 +08:00
super ( app ) ;
this . prompt _text = prompt _text ;
this . default _value = default _value ;
2023-09-05 17:29:16 +08:00
this . multi _line = multi _line ;
2022-08-24 16:29:06 +08:00
this . submitted = false ;
}
onOpen ( ) {
this . titleEl . setText ( this . prompt _text ) ;
this . createForm ( ) ;
}
onClose ( ) {
this . contentEl . empty ( ) ;
if ( ! this . submitted ) {
2023-09-05 17:29:16 +08:00
this . reject ( ) ;
2022-08-24 16:29:06 +08:00
}
}
createForm ( ) {
const div = this . contentEl . createDiv ( ) ;
div . addClass ( "templater-prompt-div" ) ;
2023-09-05 17:29:16 +08:00
let textInput ;
if ( this . multi _line ) {
textInput = new import _obsidian9 . TextAreaComponent ( div ) ;
const buttonDiv = this . contentEl . createDiv ( ) ;
buttonDiv . addClass ( "templater-button-div" ) ;
const submitButton = new import _obsidian9 . ButtonComponent ( buttonDiv ) ;
submitButton . buttonEl . addClass ( "mod-cta" ) ;
submitButton . setButtonText ( "Submit" ) . onClick ( ( evt ) => {
this . resolveAndClose ( evt ) ;
} ) ;
} else {
textInput = new import _obsidian9 . TextComponent ( div ) ;
}
this . value = this . default _value ? ? "" ;
textInput . inputEl . addClass ( "templater-prompt-input" ) ;
textInput . setPlaceholder ( "Type text here" ) ;
textInput . setValue ( this . value ) ;
textInput . onChange ( ( value ) => this . value = value ) ;
textInput . inputEl . addEventListener ( "keydown" , ( evt ) => this . enterCallback ( evt ) ) ;
}
enterCallback ( evt ) {
if ( this . multi _line ) {
if ( import _obsidian9 . Platform . isDesktop ) {
if ( evt . shiftKey && evt . key === "Enter" ) {
} else if ( evt . key === "Enter" ) {
this . resolveAndClose ( evt ) ;
}
} else {
if ( evt . key === "Enter" ) {
evt . preventDefault ( ) ;
}
}
} else {
if ( evt . key === "Enter" ) {
this . resolveAndClose ( evt ) ;
}
}
}
resolveAndClose ( evt ) {
this . submitted = true ;
evt . preventDefault ( ) ;
this . resolve ( this . value ) ;
this . close ( ) ;
}
async openAndGetValue ( resolve , reject ) {
this . resolve = resolve ;
this . reject = reject ;
this . open ( ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/system/SuggesterModal.ts
var import _obsidian10 = _ _toModule ( require ( "obsidian" ) ) ;
var SuggesterModal = class extends import _obsidian10 . FuzzySuggestModal {
2023-09-05 17:29:16 +08:00
constructor ( text _items , items , placeholder , limit ) {
2022-08-24 16:29:06 +08:00
super ( app ) ;
this . text _items = text _items ;
this . items = items ;
this . submitted = false ;
this . setPlaceholder ( placeholder ) ;
2023-09-05 17:29:16 +08:00
limit && ( this . limit = limit ) ;
2022-08-24 16:29:06 +08:00
}
getItems ( ) {
return this . items ;
}
onClose ( ) {
if ( ! this . submitted ) {
this . reject ( new TemplaterError ( "Cancelled prompt" ) ) ;
}
}
selectSuggestion ( value , evt ) {
this . submitted = true ;
this . close ( ) ;
this . onChooseSuggestion ( value , evt ) ;
}
getItemText ( item ) {
if ( this . text _items instanceof Function ) {
return this . text _items ( item ) ;
}
return this . text _items [ this . items . indexOf ( item ) ] || "Undefined Text Item" ;
}
onChooseItem ( item ) {
this . resolve ( item ) ;
}
2023-09-05 17:29:16 +08:00
async openAndGetValue ( resolve , reject ) {
this . resolve = resolve ;
this . reject = reject ;
this . open ( ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/system/InternalModuleSystem.ts
var InternalModuleSystem = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "system" ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
this . static _functions . set ( "clipboard" , this . generate _clipboard ( ) ) ;
this . static _functions . set ( "prompt" , this . generate _prompt ( ) ) ;
this . static _functions . set ( "suggester" , this . generate _suggester ( ) ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async create _dynamic _templates ( ) {
2022-08-24 16:29:06 +08:00
}
generate _clipboard ( ) {
2023-09-05 17:29:16 +08:00
return async ( ) => {
return await navigator . clipboard . readText ( ) ;
} ;
2022-08-24 16:29:06 +08:00
}
generate _prompt ( ) {
2023-09-05 17:29:16 +08:00
return async ( prompt _text , default _value , throw _on _cancel = false , multi _line = false ) => {
const prompt = new PromptModal ( prompt _text , default _value , multi _line ) ;
const promise = new Promise ( ( resolve , reject ) => prompt . openAndGetValue ( resolve , reject ) ) ;
2022-08-24 16:29:06 +08:00
try {
2023-09-05 17:29:16 +08:00
return await promise ;
2022-08-24 16:29:06 +08:00
} catch ( error ) {
if ( throw _on _cancel ) {
throw error ;
}
return null ;
}
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
generate _suggester ( ) {
2023-09-05 17:29:16 +08:00
return async ( text _items , items , throw _on _cancel = false , placeholder = "" , limit ) => {
const suggester = new SuggesterModal ( text _items , items , placeholder , limit ) ;
const promise = new Promise ( ( resolve , reject ) => suggester . openAndGetValue ( resolve , reject ) ) ;
2022-08-24 16:29:06 +08:00
try {
2023-09-05 17:29:16 +08:00
return await promise ;
2022-08-24 16:29:06 +08:00
} catch ( error ) {
if ( throw _on _cancel ) {
throw error ;
}
return null ;
}
2023-09-05 17:29:16 +08:00
} ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/config/InternalModuleConfig.ts
var InternalModuleConfig = class extends InternalModule {
constructor ( ) {
super ( ... arguments ) ;
this . name = "config" ;
}
2023-09-05 17:29:16 +08:00
async create _static _templates ( ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async create _dynamic _templates ( ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async generate _object ( config ) {
return config ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/internal_functions/InternalFunctions.ts
var InternalFunctions = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
this . modules _array = [ ] ;
2023-09-05 17:29:16 +08:00
this . modules _array . push ( new InternalModuleDate ( this . plugin ) ) ;
this . modules _array . push ( new InternalModuleFile ( this . plugin ) ) ;
this . modules _array . push ( new InternalModuleWeb ( this . plugin ) ) ;
this . modules _array . push ( new InternalModuleFrontmatter ( this . plugin ) ) ;
this . modules _array . push ( new InternalModuleSystem ( this . plugin ) ) ;
this . modules _array . push ( new InternalModuleConfig ( this . plugin ) ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async init ( ) {
for ( const mod of this . modules _array ) {
await mod . init ( ) ;
}
}
async generate _object ( config ) {
const internal _functions _object = { } ;
for ( const mod of this . modules _array ) {
internal _functions _object [ mod . getName ( ) ] = await mod . generate _object ( config ) ;
}
return internal _functions _object ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/user_functions/UserSystemFunctions.ts
var import _child _process = _ _toModule ( require ( "child_process" ) ) ;
var import _util = _ _toModule ( require ( "util" ) ) ;
2023-11-10 10:46:38 +08:00
var import _obsidian11 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
var UserSystemFunctions = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
2023-11-10 10:46:38 +08:00
if ( import _obsidian11 . Platform . isMobileApp || ! ( app . vault . adapter instanceof import _obsidian11 . FileSystemAdapter ) ) {
2022-08-24 16:29:06 +08:00
this . cwd = "" ;
} else {
this . cwd = app . vault . adapter . getBasePath ( ) ;
this . exec _promise = ( 0 , import _util . promisify ) ( import _child _process . exec ) ;
}
}
2023-09-05 17:29:16 +08:00
async generate _system _functions ( config ) {
const user _system _functions = new Map ( ) ;
const internal _functions _object = await this . plugin . templater . functions _generator . generate _object ( config , FunctionsMode . INTERNAL ) ;
for ( const template _pair of this . plugin . settings . templates _pairs ) {
const template = template _pair [ 0 ] ;
let cmd = template _pair [ 1 ] ;
if ( ! template || ! cmd ) {
continue ;
}
2023-11-10 10:46:38 +08:00
if ( import _obsidian11 . Platform . isMobileApp ) {
2023-09-05 17:29:16 +08:00
user _system _functions . set ( template , ( ) => {
return new Promise ( ( resolve ) => resolve ( UNSUPPORTED _MOBILE _TEMPLATE ) ) ;
} ) ;
} else {
cmd = await this . plugin . templater . parser . parse _commands ( cmd , internal _functions _object ) ;
user _system _functions . set ( template , async ( user _args ) => {
const process _env = {
... process . env ,
... user _args
} ;
const cmd _options = {
timeout : this . plugin . settings . command _timeout * 1e3 ,
cwd : this . cwd ,
env : process _env ,
... this . plugin . settings . shell _path && {
2022-08-24 16:29:06 +08:00
shell : this . plugin . settings . shell _path
}
2023-09-05 17:29:16 +08:00
} ;
try {
const { stdout } = await this . exec _promise ( cmd , cmd _options ) ;
return stdout . trimRight ( ) ;
} catch ( error ) {
throw new TemplaterError ( ` Error with User Template ${ template } ` , error ) ;
}
} ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
return user _system _functions ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async generate _object ( config ) {
const user _system _functions = await this . generate _system _functions ( config ) ;
return Object . fromEntries ( user _system _functions ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/user_functions/UserScriptFunctions.ts
var UserScriptFunctions = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
}
2023-09-05 17:29:16 +08:00
async generate _user _script _functions ( ) {
const user _script _functions = new Map ( ) ;
const files = errorWrapperSync ( ( ) => get _tfiles _from _folder ( this . plugin . settings . user _scripts _folder ) , ` Couldn't find user script folder " ${ this . plugin . settings . user _scripts _folder } " ` ) ;
if ( ! files ) {
return new Map ( ) ;
}
for ( const file of files ) {
if ( file . extension . toLowerCase ( ) === "js" ) {
await this . load _user _script _function ( file , user _script _functions ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
return user _script _functions ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async load _user _script _function ( file , user _script _functions ) {
const req = ( s ) => {
return window . require && window . require ( s ) ;
} ;
const exp = { } ;
const mod = {
exports : exp
} ;
const file _content = await app . vault . read ( file ) ;
const wrapping _fn = window . eval ( "(function anonymous(require, module, exports){" + file _content + "\n})" ) ;
2023-10-17 15:38:39 +08:00
try {
wrapping _fn ( req , mod , exp ) ;
} catch ( err ) {
throw new TemplaterError ( ` Failed to load user script at " ${ file . path } ". ` , err . message ) ;
}
2023-09-05 17:29:16 +08:00
const user _function = exp [ "default" ] || mod . exports ;
if ( ! user _function ) {
2023-10-17 15:38:39 +08:00
throw new TemplaterError ( ` Failed to load user script at " ${ file . path } ". No exports detected. ` ) ;
2023-09-05 17:29:16 +08:00
}
if ( ! ( user _function instanceof Function ) ) {
2023-10-17 15:38:39 +08:00
throw new TemplaterError ( ` Failed to load user script at " ${ file . path } ". Default export is not a function. ` ) ;
2023-09-05 17:29:16 +08:00
}
user _script _functions . set ( ` ${ file . basename } ` , user _function ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async generate _object ( ) {
const user _script _functions = await this . generate _user _script _functions ( ) ;
return Object . fromEntries ( user _script _functions ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/user_functions/UserFunctions.ts
var UserFunctions = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
2023-09-05 17:29:16 +08:00
this . user _system _functions = new UserSystemFunctions ( plugin ) ;
this . user _script _functions = new UserScriptFunctions ( plugin ) ;
}
async generate _object ( config ) {
let user _system _functions = { } ;
let user _script _functions = { } ;
if ( this . plugin . settings . enable _system _commands ) {
user _system _functions = await this . user _system _functions . generate _object ( config ) ;
}
if ( this . plugin . settings . user _scripts _folder ) {
user _script _functions = await this . user _script _functions . generate _object ( ) ;
}
return {
... user _system _functions ,
... user _script _functions
} ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/functions/FunctionsGenerator.ts
var obsidian _module = _ _toModule ( require ( "obsidian" ) ) ;
var FunctionsMode ;
( function ( FunctionsMode2 ) {
FunctionsMode2 [ FunctionsMode2 [ "INTERNAL" ] = 0 ] = "INTERNAL" ;
FunctionsMode2 [ FunctionsMode2 [ "USER_INTERNAL" ] = 1 ] = "USER_INTERNAL" ;
} ) ( FunctionsMode || ( FunctionsMode = { } ) ) ;
var FunctionsGenerator = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
2023-09-05 17:29:16 +08:00
this . internal _functions = new InternalFunctions ( this . plugin ) ;
this . user _functions = new UserFunctions ( this . plugin ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async init ( ) {
await this . internal _functions . init ( ) ;
2022-08-24 16:29:06 +08:00
}
additional _functions ( ) {
return {
obsidian : obsidian _module
} ;
}
2023-09-05 17:29:16 +08:00
async generate _object ( config , functions _mode = 1 ) {
const final _object = { } ;
const additional _functions _object = this . additional _functions ( ) ;
const internal _functions _object = await this . internal _functions . generate _object ( config ) ;
let user _functions _object = { } ;
Object . assign ( final _object , additional _functions _object ) ;
switch ( functions _mode ) {
case 0 :
Object . assign ( final _object , internal _functions _object ) ;
break ;
case 1 :
user _functions _object = await this . user _functions . generate _object ( config ) ;
Object . assign ( final _object , {
... internal _functions _object ,
user : user _functions _object
} ) ;
break ;
}
return final _object ;
2022-08-24 16:29:06 +08:00
}
} ;
2023-09-05 17:29:16 +08:00
// node_modules/@silentvoid13/rusty_engine/rusty_engine.js
var import _meta = { } ;
var wasm ;
var heap = new Array ( 32 ) . fill ( void 0 ) ;
heap . push ( void 0 , null , true , false ) ;
function getObject ( idx ) {
return heap [ idx ] ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var heap _next = heap . length ;
function dropObject ( idx ) {
if ( idx < 36 )
return ;
heap [ idx ] = heap _next ;
heap _next = idx ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function takeObject ( idx ) {
const ret = getObject ( idx ) ;
dropObject ( idx ) ;
return ret ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var cachedTextDecoder = new TextDecoder ( "utf-8" , { ignoreBOM : true , fatal : true } ) ;
cachedTextDecoder . decode ( ) ;
var cachedUint8Memory0 = new Uint8Array ( ) ;
function getUint8Memory0 ( ) {
if ( cachedUint8Memory0 . byteLength === 0 ) {
cachedUint8Memory0 = new Uint8Array ( wasm . memory . buffer ) ;
}
return cachedUint8Memory0 ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function getStringFromWasm0 ( ptr , len ) {
return cachedTextDecoder . decode ( getUint8Memory0 ( ) . subarray ( ptr , ptr + len ) ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function addHeapObject ( obj ) {
if ( heap _next === heap . length )
heap . push ( heap . length + 1 ) ;
const idx = heap _next ;
heap _next = heap [ idx ] ;
heap [ idx ] = obj ;
return idx ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var WASM _VECTOR _LEN = 0 ;
var cachedTextEncoder = new TextEncoder ( "utf-8" ) ;
var encodeString = typeof cachedTextEncoder . encodeInto === "function" ? function ( arg , view ) {
return cachedTextEncoder . encodeInto ( arg , view ) ;
} : function ( arg , view ) {
const buf = cachedTextEncoder . encode ( arg ) ;
view . set ( buf ) ;
return {
read : arg . length ,
written : buf . length
} ;
} ;
function passStringToWasm0 ( arg , malloc , realloc ) {
if ( realloc === void 0 ) {
const buf = cachedTextEncoder . encode ( arg ) ;
const ptr2 = malloc ( buf . length ) ;
getUint8Memory0 ( ) . subarray ( ptr2 , ptr2 + buf . length ) . set ( buf ) ;
WASM _VECTOR _LEN = buf . length ;
return ptr2 ;
}
let len = arg . length ;
let ptr = malloc ( len ) ;
const mem = getUint8Memory0 ( ) ;
let offset2 = 0 ;
for ( ; offset2 < len ; offset2 ++ ) {
const code = arg . charCodeAt ( offset2 ) ;
if ( code > 127 )
break ;
mem [ ptr + offset2 ] = code ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
if ( offset2 !== len ) {
if ( offset2 !== 0 ) {
arg = arg . slice ( offset2 ) ;
}
ptr = realloc ( ptr , len , len = offset2 + arg . length * 3 ) ;
const view = getUint8Memory0 ( ) . subarray ( ptr + offset2 , ptr + len ) ;
const ret = encodeString ( arg , view ) ;
offset2 += ret . written ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
WASM _VECTOR _LEN = offset2 ;
return ptr ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function isLikeNone ( x ) {
return x === void 0 || x === null ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var cachedInt32Memory0 = new Int32Array ( ) ;
function getInt32Memory0 ( ) {
if ( cachedInt32Memory0 . byteLength === 0 ) {
cachedInt32Memory0 = new Int32Array ( wasm . memory . buffer ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
return cachedInt32Memory0 ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function debugString ( val ) {
const type = typeof val ;
if ( type == "number" || type == "boolean" || val == null ) {
return ` ${ val } ` ;
}
if ( type == "string" ) {
return ` " ${ val } " ` ;
}
if ( type == "symbol" ) {
const description = val . description ;
if ( description == null ) {
return "Symbol" ;
2022-08-24 16:29:06 +08:00
} else {
2023-09-05 17:29:16 +08:00
return ` Symbol( ${ description } ) ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
if ( type == "function" ) {
const name = val . name ;
if ( typeof name == "string" && name . length > 0 ) {
return ` Function( ${ name } ) ` ;
2022-08-24 16:29:06 +08:00
} else {
2023-09-05 17:29:16 +08:00
return "Function" ;
2022-08-24 16:29:06 +08:00
}
}
2023-09-05 17:29:16 +08:00
if ( Array . isArray ( val ) ) {
const length = val . length ;
let debug = "[" ;
if ( length > 0 ) {
debug += debugString ( val [ 0 ] ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
for ( let i = 1 ; i < length ; i ++ ) {
debug += ", " + debugString ( val [ i ] ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
debug += "]" ;
return debug ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const builtInMatches = /\[object ([^\]]+)\]/ . exec ( toString . call ( val ) ) ;
let className ;
if ( builtInMatches . length > 1 ) {
className = builtInMatches [ 1 ] ;
} else {
return toString . call ( val ) ;
}
if ( className == "Object" ) {
try {
return "Object(" + JSON . stringify ( val ) + ")" ;
} catch ( _ ) {
return "Object" ;
2022-08-24 16:29:06 +08:00
}
}
2023-09-05 17:29:16 +08:00
if ( val instanceof Error ) {
return ` ${ val . name } : ${ val . message }
$ { val . stack } ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
return className ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function _assertClass ( instance , klass ) {
if ( ! ( instance instanceof klass ) ) {
throw new Error ( ` expected instance of ${ klass . name } ` ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
return instance . ptr ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var stack _pointer = 32 ;
function addBorrowedObject ( obj ) {
if ( stack _pointer == 1 )
throw new Error ( "out of js stack" ) ;
heap [ -- stack _pointer ] = obj ;
return stack _pointer ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function handleError ( f , args ) {
2022-08-24 16:29:06 +08:00
try {
2023-09-05 17:29:16 +08:00
return f . apply ( this , args ) ;
2022-08-24 16:29:06 +08:00
} catch ( e ) {
2023-09-05 17:29:16 +08:00
wasm . _ _wbindgen _exn _store ( addHeapObject ( e ) ) ;
2022-08-24 16:29:06 +08:00
}
}
2023-09-05 17:29:16 +08:00
var ParserConfig = class {
static _ _wrap ( ptr ) {
const obj = Object . create ( ParserConfig . prototype ) ;
obj . ptr = ptr ;
return obj ;
}
_ _destroy _into _raw ( ) {
const ptr = this . ptr ;
this . ptr = 0 ;
return ptr ;
}
free ( ) {
const ptr = this . _ _destroy _into _raw ( ) ;
wasm . _ _wbg _parserconfig _free ( ptr ) ;
}
get interpolate ( ) {
const ret = wasm . _ _wbg _get _parserconfig _interpolate ( this . ptr ) ;
return String . fromCodePoint ( ret ) ;
}
set interpolate ( arg0 ) {
wasm . _ _wbg _set _parserconfig _interpolate ( this . ptr , arg0 . codePointAt ( 0 ) ) ;
}
get execution ( ) {
const ret = wasm . _ _wbg _get _parserconfig _execution ( this . ptr ) ;
return String . fromCodePoint ( ret ) ;
}
set execution ( arg0 ) {
wasm . _ _wbg _set _parserconfig _execution ( this . ptr , arg0 . codePointAt ( 0 ) ) ;
}
get single _whitespace ( ) {
const ret = wasm . _ _wbg _get _parserconfig _single _whitespace ( this . ptr ) ;
return String . fromCodePoint ( ret ) ;
}
set single _whitespace ( arg0 ) {
wasm . _ _wbg _set _parserconfig _single _whitespace ( this . ptr , arg0 . codePointAt ( 0 ) ) ;
}
get multiple _whitespace ( ) {
const ret = wasm . _ _wbg _get _parserconfig _multiple _whitespace ( this . ptr ) ;
return String . fromCodePoint ( ret ) ;
}
set multiple _whitespace ( arg0 ) {
wasm . _ _wbg _set _parserconfig _multiple _whitespace ( this . ptr , arg0 . codePointAt ( 0 ) ) ;
}
constructor ( opt , clt , inte , ex , sw , mw , gv ) {
const ptr0 = passStringToWasm0 ( opt , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
const ptr1 = passStringToWasm0 ( clt , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len1 = WASM _VECTOR _LEN ;
const ptr2 = passStringToWasm0 ( gv , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len2 = WASM _VECTOR _LEN ;
const ret = wasm . parserconfig _new ( ptr0 , len0 , ptr1 , len1 , inte . codePointAt ( 0 ) , ex . codePointAt ( 0 ) , sw . codePointAt ( 0 ) , mw . codePointAt ( 0 ) , ptr2 , len2 ) ;
return ParserConfig . _ _wrap ( ret ) ;
}
get opening _tag ( ) {
try {
const retptr = wasm . _ _wbindgen _add _to _stack _pointer ( - 16 ) ;
wasm . parserconfig _opening _tag ( retptr , this . ptr ) ;
var r0 = getInt32Memory0 ( ) [ retptr / 4 + 0 ] ;
var r1 = getInt32Memory0 ( ) [ retptr / 4 + 1 ] ;
return getStringFromWasm0 ( r0 , r1 ) ;
} finally {
wasm . _ _wbindgen _add _to _stack _pointer ( 16 ) ;
wasm . _ _wbindgen _free ( r0 , r1 ) ;
}
}
set opening _tag ( val ) {
const ptr0 = passStringToWasm0 ( val , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
wasm . parserconfig _set _opening _tag ( this . ptr , ptr0 , len0 ) ;
}
get closing _tag ( ) {
try {
const retptr = wasm . _ _wbindgen _add _to _stack _pointer ( - 16 ) ;
wasm . parserconfig _closing _tag ( retptr , this . ptr ) ;
var r0 = getInt32Memory0 ( ) [ retptr / 4 + 0 ] ;
var r1 = getInt32Memory0 ( ) [ retptr / 4 + 1 ] ;
return getStringFromWasm0 ( r0 , r1 ) ;
} finally {
wasm . _ _wbindgen _add _to _stack _pointer ( 16 ) ;
wasm . _ _wbindgen _free ( r0 , r1 ) ;
}
}
set closing _tag ( val ) {
const ptr0 = passStringToWasm0 ( val , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
wasm . parserconfig _set _closing _tag ( this . ptr , ptr0 , len0 ) ;
}
get global _var ( ) {
try {
const retptr = wasm . _ _wbindgen _add _to _stack _pointer ( - 16 ) ;
wasm . parserconfig _global _var ( retptr , this . ptr ) ;
var r0 = getInt32Memory0 ( ) [ retptr / 4 + 0 ] ;
var r1 = getInt32Memory0 ( ) [ retptr / 4 + 1 ] ;
return getStringFromWasm0 ( r0 , r1 ) ;
} finally {
wasm . _ _wbindgen _add _to _stack _pointer ( 16 ) ;
wasm . _ _wbindgen _free ( r0 , r1 ) ;
2022-08-24 16:29:06 +08:00
}
}
2023-09-05 17:29:16 +08:00
set global _var ( val ) {
const ptr0 = passStringToWasm0 ( val , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
wasm . parserconfig _set _global _var ( this . ptr , ptr0 , len0 ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
} ;
var Renderer = class {
static _ _wrap ( ptr ) {
const obj = Object . create ( Renderer . prototype ) ;
obj . ptr = ptr ;
return obj ;
}
_ _destroy _into _raw ( ) {
const ptr = this . ptr ;
this . ptr = 0 ;
return ptr ;
}
free ( ) {
const ptr = this . _ _destroy _into _raw ( ) ;
wasm . _ _wbg _renderer _free ( ptr ) ;
}
constructor ( config ) {
_assertClass ( config , ParserConfig ) ;
var ptr0 = config . ptr ;
config . ptr = 0 ;
const ret = wasm . renderer _new ( ptr0 ) ;
return Renderer . _ _wrap ( ret ) ;
}
render _content ( content , context ) {
try {
const retptr = wasm . _ _wbindgen _add _to _stack _pointer ( - 16 ) ;
const ptr0 = passStringToWasm0 ( content , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
wasm . renderer _render _content ( retptr , this . ptr , ptr0 , len0 , addBorrowedObject ( context ) ) ;
var r0 = getInt32Memory0 ( ) [ retptr / 4 + 0 ] ;
var r1 = getInt32Memory0 ( ) [ retptr / 4 + 1 ] ;
var r2 = getInt32Memory0 ( ) [ retptr / 4 + 2 ] ;
if ( r2 ) {
throw takeObject ( r1 ) ;
}
return takeObject ( r0 ) ;
} finally {
wasm . _ _wbindgen _add _to _stack _pointer ( 16 ) ;
heap [ stack _pointer ++ ] = void 0 ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
} ;
async function load ( module2 , imports ) {
if ( typeof Response === "function" && module2 instanceof Response ) {
if ( typeof WebAssembly . instantiateStreaming === "function" ) {
try {
return await WebAssembly . instantiateStreaming ( module2 , imports ) ;
} catch ( e ) {
if ( module2 . headers . get ( "Content-Type" ) != "application/wasm" ) {
console . warn ( "`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n" , e ) ;
} else {
throw e ;
}
2022-08-24 16:29:06 +08:00
}
}
2023-09-05 17:29:16 +08:00
const bytes = await module2 . arrayBuffer ( ) ;
return await WebAssembly . instantiate ( bytes , imports ) ;
} else {
const instance = await WebAssembly . instantiate ( module2 , imports ) ;
if ( instance instanceof WebAssembly . Instance ) {
return { instance , module : module2 } ;
} else {
return instance ;
2022-08-24 16:29:06 +08:00
}
}
}
2023-09-05 17:29:16 +08:00
function getImports ( ) {
const imports = { } ;
imports . wbg = { } ;
imports . wbg . _ _wbindgen _object _drop _ref = function ( arg0 ) {
takeObject ( arg0 ) ;
} ;
imports . wbg . _ _wbindgen _string _new = function ( arg0 , arg1 ) {
const ret = getStringFromWasm0 ( arg0 , arg1 ) ;
return addHeapObject ( ret ) ;
} ;
imports . wbg . _ _wbindgen _string _get = function ( arg0 , arg1 ) {
const obj = getObject ( arg1 ) ;
const ret = typeof obj === "string" ? obj : void 0 ;
var ptr0 = isLikeNone ( ret ) ? 0 : passStringToWasm0 ( ret , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
var len0 = WASM _VECTOR _LEN ;
getInt32Memory0 ( ) [ arg0 / 4 + 1 ] = len0 ;
getInt32Memory0 ( ) [ arg0 / 4 + 0 ] = ptr0 ;
} ;
imports . wbg . _ _wbg _call _97ae9d8645dc388b = function ( ) {
return handleError ( function ( arg0 , arg1 ) {
const ret = getObject ( arg0 ) . call ( getObject ( arg1 ) ) ;
return addHeapObject ( ret ) ;
} , arguments ) ;
} ;
imports . wbg . _ _wbg _new _8d2af00bc1e329ee = function ( arg0 , arg1 ) {
const ret = new Error ( getStringFromWasm0 ( arg0 , arg1 ) ) ;
return addHeapObject ( ret ) ;
} ;
imports . wbg . _ _wbg _message _fe2af63ccc8985bc = function ( arg0 ) {
const ret = getObject ( arg0 ) . message ;
return addHeapObject ( ret ) ;
} ;
imports . wbg . _ _wbg _newwithargs _8fe23e3842840c8e = function ( arg0 , arg1 , arg2 , arg3 ) {
const ret = new Function ( getStringFromWasm0 ( arg0 , arg1 ) , getStringFromWasm0 ( arg2 , arg3 ) ) ;
return addHeapObject ( ret ) ;
} ;
imports . wbg . _ _wbg _call _168da88779e35f61 = function ( ) {
return handleError ( function ( arg0 , arg1 , arg2 ) {
const ret = getObject ( arg0 ) . call ( getObject ( arg1 ) , getObject ( arg2 ) ) ;
return addHeapObject ( ret ) ;
} , arguments ) ;
} ;
imports . wbg . _ _wbg _call _3999bee59e9f7719 = function ( ) {
return handleError ( function ( arg0 , arg1 , arg2 , arg3 ) {
const ret = getObject ( arg0 ) . call ( getObject ( arg1 ) , getObject ( arg2 ) , getObject ( arg3 ) ) ;
return addHeapObject ( ret ) ;
} , arguments ) ;
} ;
imports . wbg . _ _wbindgen _debug _string = function ( arg0 , arg1 ) {
const ret = debugString ( getObject ( arg1 ) ) ;
const ptr0 = passStringToWasm0 ( ret , wasm . _ _wbindgen _malloc , wasm . _ _wbindgen _realloc ) ;
const len0 = WASM _VECTOR _LEN ;
getInt32Memory0 ( ) [ arg0 / 4 + 1 ] = len0 ;
getInt32Memory0 ( ) [ arg0 / 4 + 0 ] = ptr0 ;
} ;
imports . wbg . _ _wbindgen _throw = function ( arg0 , arg1 ) {
throw new Error ( getStringFromWasm0 ( arg0 , arg1 ) ) ;
} ;
return imports ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function initMemory ( imports , maybe _memory ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
function finalizeInit ( instance , module2 ) {
wasm = instance . exports ;
init . _ _wbindgen _wasm _module = module2 ;
cachedInt32Memory0 = new Int32Array ( ) ;
cachedUint8Memory0 = new Uint8Array ( ) ;
return wasm ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async function init ( input ) {
if ( typeof input === "undefined" ) {
input = new URL ( "rusty_engine_bg.wasm" , import _meta . url ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const imports = getImports ( ) ;
if ( typeof input === "string" || typeof Request === "function" && input instanceof Request || typeof URL === "function" && input instanceof URL ) {
input = fetch ( input ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
initMemory ( imports ) ;
const { instance , module : module2 } = await load ( await input , imports ) ;
return finalizeInit ( instance , module2 ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
var rusty _engine _default = init ;
// wasm-embed:/home/runner/work/Templater/Templater/node_modules/@silentvoid13/rusty_engine/rusty_engine_bg.wasm
var rusty _engine _bg _default = _ _toBinary ( " AGFzbQEAAAABvwEaYAJ / fwBgAn9 / AX9gAX8Bf2ADf39 / AX9gA39 / fwBgAX8AYAV / f39 / fwBgBH9 / f38AYAR / f39 / AX9gAABgBX9 / f39 / AX9gAX8BfmAAAX9gBn9 / f39 / fwBgB39 / f39 / f38AYAV / f35 / fwBgBX9 / fX9 / AGAFf398f38AYAR / fn9 / AGAFf35 / f38AYAR / fX9 / AGAEf3x / fwBgBn9 / f39 / fwF / YAd / f39 / f39 / AX9gCn9 / f39 / f39 / f38Bf2ACfn8BfwLkAgsDd2JnGl9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmAAUDd2JnFV9fd2JpbmRnZW5fc3RyaW5nX25ldwABA3diZxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAAAN3YmcbX193YmdfY2FsbF85N2FlOWQ4NjQ1ZGMzODhiAAEDd2JnGl9fd2JnX25ld184ZDJhZjAwYmMxZTMyOWVlAAEDd2JnHl9fd2JnX21lc3NhZ2VfZmUyYWY2M2NjYzg5ODViYwACA3diZyJfX3diZ19uZXd3aXRoYXJnc184ZmUyM2UzODQyODQwYzhlAAgDd2JnG19fd2JnX2NhbGxfMTY4ZGE4ODc3OWUzNWY2MQADA3diZxtfX3diZ19jYWxsXzM5OTliZWU1OWU5Zjc3MTkACAN3YmcXX193YmluZGdlbl9kZWJ1Z19zdHJpbmcAAAN3YmcQX193YmluZGdlbl90aHJvdwAAA7kBtwECBwAGAgYEBAcBBQMKCAAEBgYAAwcCAAEADgETAQQXAQICAQAAAwcZAQAFAQwABgACAgAAAgAEBAAGAQAAAAAEBw0CAQUEBQYCDBgAAQAAAAQBAQEAAQABBAQEBgMDBwMJAwQIAAAABQkAAgEAAAAABwAAAgICAgAFBQMEFgoGEQ8QAAUHAwIBAgABBQEBCAACAQEBBQEAAgECAgACAQEBAgAJCQICAgIAAAAAAwMDAQECAgsLCwUEBQFwATs7BQMBABEGCQF / AUGAgMAACwfcBRkGbWVtb3J5AgAXX193YmdfcGFyc2VyY29uZmlnX2ZyZWUAUSJfX3diZ19nZXRfcGFyc2VyY29uZmlnX2ludGVycG9sYXRlAH4iX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19pbnRlcnBvbGF0ZQB3IF9fd2JnX2dldF9wYXJzZXJjb25maWdfZXhlY3V0aW9uAH8gX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19leGVjdXRpb24AeChfX3diZ19nZXRfcGFyc2VyY29uZmlnX3NpbmdsZV93aGl0ZXNwYWNlAIABKF9fd2JnX3NldF9wYXJzZXJjb25maWdfc2luZ2xlX3doaXRlc3BhY2UAeSpfX3diZ19nZXRfcGFyc2VyY29uZmlnX211bHRpcGxlX3doaXRlc3BhY2UAgQEqX193Ymdfc2V0X3BhcnNlcmNvbmZpZ19tdWx0aXBsZV93aGl0ZXNwYWNlAHoQcGFyc2VyY29uZmlnX25ldwBVGHBhcnNlcmNvbmZpZ19vcGVuaW5nX3RhZwBGHHBhcnNlcmNvbmZpZ19zZXRfb3BlbmluZ190YWcAYxhwYXJzZXJjb25maWdfY2xvc2luZ190YWcARxxwYXJzZXJjb25maWdfc2V0X2Nsb3NpbmdfdGFnAGQXcGFyc2VyY29uZmlnX2dsb2JhbF92YXIASBtwYXJzZXJjb25maWdfc2V0X2dsb2JhbF92YXIAZRNfX3diZ19yZW5kZXJlcl9mcmVlAE8McmVuZGVyZXJfbmV3ACAXcmVuZGVyZXJfcmVuZGVyX2NvbnRlbnQAORFfX3diaW5kZ2VuX21hbGxvYwB1El9fd2JpbmRnZW5fcmVhbGxvYwCFAR9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAKsBD19fd2JpbmRnZW5fZnJlZQCaARRfX3diaW5kZ2VuX2V4bl9zdG9yZQCfAQllAQBBAQs6mAGdAaoBPzzBAZUBlgFOkgGOAWotYsEBwQFnKl3BAXaIAUyJAYgBhwGQAY8BiQGJAYwBigGLAZgBX8EBaKABXo4BvwG + AYQBOElwoQHBAWioAWCjAVclqQGcAcEBwAEK2dYCtwG8IAIPfwF + IwBBEGsiCyQAAkACQCAAQfUBTwRAQYCAfEEIQQgQlwFBFEEIEJcBakEQQQgQlwFqa0F3cUF9aiICQQBBEEEIEJcBQQJ0ayIBIAEgAksbIABNDQIgAEEEakEIEJcBIQRBrK7AACgCAEUNAUEAIARrIQMCQAJAAn9BACAEQYACSQ0AGkEfIARB ////B0sNABogBEEGIARBCHZnIgBrdkEBcSAAQQF0a0E+agsiBkECdEG4sMAAaigCACIABEAgBCAGEJMBdCEHQQAhAQNAAkAgABCvASICIARJDQAgAiAEayICIANPDQAgACEBIAIiAw0AQQAhAwwDCyAAQRRqKAIAIgIgBSACIAAgB0EddkEEcWpBEGooAgAiAEcbIAUgAhshBSAHQQF0IQcgAA0ACyAFBEAgBSEADAILIAENAgtBACEBQQEgBnQQmwFBrK7AACgCAHEiAEUNAyAAEKQBaEECdEG4sMAAaigCACIARQ0DCwNAIAAgASAAEK8BIgEgBE8gASAEayIFIANJcSICGyEBIAUgAyACGyEDIAAQkQEiAA0ACyABRQ0CC0G4scAAKAIAIgAgBE9BACADIAAgBGtPGw0BIAEiACAEELoBIQYgABA1AkAgA0EQQQgQlwFPBEAgACAEEKYBIAYgAxCUASADQYACTwRAIAYgAxA0DAILIANBA3YiAUEDdEGwrsAAaiEFAn9BqK7AACgCACICQQEgAXQiAXEEQCAFKAIIDAELQaiuwAAgASACcjYCACAFCyEBIAUgBjYCCCABIAY2AgwgBiAFNgIMIAYgATYCCAwBCyAAIAMgBGoQjQELIAAQvAEiA0UNAQwCC0EQIABBBGpBEEEIEJcBQXtqIABLG0EIEJcBIQQCQAJAAkACfwJAAkBBqK7AACgCACIBIARBA3YiAHYiAkEDcUUEQCAEQbixwAAoAgBNDQcgAg0BQayuwAAoAgAiAEUNByAAEKQBaEECdEG4sMAAaigCACIBEK8BIARrIQMgARCRASIABEADQCAAEK8BIARrIgIgAyACIANJIgIbIQMgACABIAIbIQEgABCRASIADQALCyABIgAgBBC6ASEFIAAQNSADQRBBCBCXAUkNBSAAIAQQpgEgBSADEJQBQbixwAAoAgAiAUUNBCABQQN2IgFBA3RBsK7AAGohB0HAscAAKAIAIQZBqK7AACgCACICQQEgAXQiAXFFDQIgBygCCAwDCwJAIAJBf3NBAXEgAGoiA0EDdCIAQbiuwABqKAIAIgVBCGooAgAiAiAAQbCuwABqIgBHBEAgAiAANgIMIAAgAjYCCAwBC0GorsAAIAFBfiADd3E2AgALIAUgA0EDdBCNASAFELwBIQMMBwsCQEEBIABBH3EiAHQQmwEgAiAAdHEQpAFoIgJBA3QiAEG4rsAAaigCACIDQQhqKAIAIgEgAEGwrsAAaiIARwRAIAEgADYCDCAAIAE2AggMAQtBqK7AAEGorsAAKAIAQX4gAndxNgIACyADIAQQpgEgAyAEELoBIgUgAkEDdCAEayICEJQBQbixwAAoAgAiAARAIABBA3YiAEEDdEGwrsAAaiEHQcCxwAAoAgAhBgJ/QaiuwAAoAgAiAUEBIAB0IgBxBEAgBygCCAwBC0GorsAAIAAgAXI2AgAgBwshACAHIAY2AgggACAGNgIMIAYgBzYCDCAGIAA2AggLQcCxwAAgBTYCAEG4scAAIAI2AgAgAxC8ASEDDAYLQaiuwAAgASACcjYCACAHCyEBIAcgBjYCCCABIAY2AgwgBiAHNgIMIAYgATYCCAtBwLHAACAFNgIAQbixwAAgAzYCAAwBCyAAIAMgBGoQjQELIAAQvAEiAw0BCwJAAkACQAJAAkACQAJAAkBBuLHAA
2022-08-24 16:29:06 +08:00
// src/core/parser/Parser.ts
var Parser = class {
2023-09-05 17:29:16 +08:00
async init ( ) {
await rusty _engine _default ( rusty _engine _bg _default ) ;
const config = new ParserConfig ( "<%" , "%>" , "\0" , "*" , "-" , "_" , "tR" ) ;
this . renderer = new Renderer ( config ) ;
}
async parse _commands ( content , context ) {
return this . renderer . render _content ( content , context ) ;
2022-08-24 16:29:06 +08:00
}
} ;
// src/core/Templater.ts
var RunMode ;
( function ( RunMode2 ) {
RunMode2 [ RunMode2 [ "CreateNewFromTemplate" ] = 0 ] = "CreateNewFromTemplate" ;
RunMode2 [ RunMode2 [ "AppendActiveFile" ] = 1 ] = "AppendActiveFile" ;
RunMode2 [ RunMode2 [ "OverwriteFile" ] = 2 ] = "OverwriteFile" ;
RunMode2 [ RunMode2 [ "OverwriteActiveFile" ] = 3 ] = "OverwriteActiveFile" ;
RunMode2 [ RunMode2 [ "DynamicProcessor" ] = 4 ] = "DynamicProcessor" ;
RunMode2 [ RunMode2 [ "StartupTemplate" ] = 5 ] = "StartupTemplate" ;
} ) ( RunMode || ( RunMode = { } ) ) ;
var Templater = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
2023-09-05 17:29:16 +08:00
this . functions _generator = new FunctionsGenerator ( this . plugin ) ;
2022-08-24 16:29:06 +08:00
this . parser = new Parser ( ) ;
}
2023-09-05 17:29:16 +08:00
async setup ( ) {
await this . parser . init ( ) ;
await this . functions _generator . init ( ) ;
this . plugin . registerMarkdownPostProcessor ( ( el , ctx ) => this . process _dynamic _templates ( el , ctx ) ) ;
2022-08-24 16:29:06 +08:00
}
create _running _config ( template _file , target _file , run _mode ) {
2023-10-17 15:38:39 +08:00
const active _file = get _active _file ( app ) ;
2022-08-24 16:29:06 +08:00
return {
template _file ,
target _file ,
run _mode ,
active _file
} ;
}
2023-09-05 17:29:16 +08:00
async read _and _parse _template ( config ) {
const template _content = await app . vault . read ( config . template _file ) ;
return this . parse _template ( config , template _content ) ;
}
async parse _template ( config , template _content ) {
const functions _object = await this . functions _generator . generate _object ( config , FunctionsMode . USER _INTERNAL ) ;
this . current _functions _object = functions _object ;
const content = await this . parser . parse _commands ( template _content , functions _object ) ;
return content ;
}
async create _new _note _from _template ( template , folder , filename , open _new _note = true ) {
if ( ! folder ) {
const new _file _location = app . vault . getConfig ( "newFileLocation" ) ;
switch ( new _file _location ) {
case "current" : {
2023-10-17 15:38:39 +08:00
const active _file = get _active _file ( app ) ;
2023-09-05 17:29:16 +08:00
if ( active _file ) {
folder = active _file . parent ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
break ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
case "folder" :
folder = app . fileManager . getNewFileParent ( "" ) ;
break ;
case "root" :
folder = app . vault . getRoot ( ) ;
break ;
default :
break ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
const created _note = await app . fileManager . createNewMarkdownFile ( folder , filename ? ? "Untitled" ) ;
let running _config ;
let output _content ;
2023-11-10 10:46:38 +08:00
if ( template instanceof import _obsidian12 . TFile ) {
2023-09-05 17:29:16 +08:00
running _config = this . create _running _config ( template , created _note , 0 ) ;
output _content = await errorWrapper ( async ( ) => this . read _and _parse _template ( running _config ) , "Template parsing error, aborting." ) ;
} else {
running _config = this . create _running _config ( void 0 , created _note , 0 ) ;
output _content = await errorWrapper ( async ( ) => this . parse _template ( running _config , template ) , "Template parsing error, aborting." ) ;
}
if ( output _content == null ) {
await app . vault . delete ( created _note ) ;
return ;
}
await app . vault . modify ( created _note , output _content ) ;
app . workspace . trigger ( "templater:new-note-from-template" , {
file : created _note ,
content : output _content
2022-08-24 16:29:06 +08:00
} ) ;
2023-09-05 17:29:16 +08:00
if ( open _new _note ) {
const active _leaf = app . workspace . getLeaf ( false ) ;
if ( ! active _leaf ) {
log _error ( new TemplaterError ( "No active leaf" ) ) ;
2022-08-24 16:29:06 +08:00
return ;
}
2023-09-05 17:29:16 +08:00
await active _leaf . openFile ( created _note , {
state : { mode : "source" }
} ) ;
await this . plugin . editor _handler . jump _to _next _cursor _location ( created _note , true ) ;
active _leaf . setEphemeralState ( {
rename : "all"
2022-08-24 16:29:06 +08:00
} ) ;
2023-09-05 17:29:16 +08:00
}
return created _note ;
}
async append _template _to _active _file ( template _file ) {
2023-11-10 10:46:38 +08:00
const active _view = app . workspace . getActiveViewOfType ( import _obsidian12 . MarkdownView ) ;
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . file || ! active _editor . editor ) {
log _error ( new TemplaterError ( "No active editor, can't append templates." ) ) ;
2023-09-05 17:29:16 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
const running _config = this . create _running _config ( template _file , active _editor . file , 1 ) ;
2023-09-05 17:29:16 +08:00
const output _content = await errorWrapper ( async ( ) => this . read _and _parse _template ( running _config ) , "Template parsing error, aborting." ) ;
if ( output _content == null ) {
return ;
}
2023-10-17 15:38:39 +08:00
const editor = active _editor . editor ;
2023-09-05 17:29:16 +08:00
const doc = editor . getDoc ( ) ;
const oldSelections = doc . listSelections ( ) ;
doc . replaceSelection ( output _content ) ;
app . workspace . trigger ( "templater:template-appended" , {
view : active _view ,
2023-10-17 15:38:39 +08:00
editor : active _editor ,
2023-09-05 17:29:16 +08:00
content : output _content ,
oldSelections ,
newSelections : doc . listSelections ( )
2022-08-24 16:29:06 +08:00
} ) ;
2023-10-17 15:38:39 +08:00
await this . plugin . editor _handler . jump _to _next _cursor _location ( active _editor . file , true ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async write _template _to _file ( template _file , file ) {
2023-11-10 10:46:38 +08:00
const active _editor = app . workspace . activeEditor ;
2023-09-05 17:29:16 +08:00
const running _config = this . create _running _config ( template _file , file , 2 ) ;
const output _content = await errorWrapper ( async ( ) => this . read _and _parse _template ( running _config ) , "Template parsing error, aborting." ) ;
if ( output _content == null ) {
return ;
}
await app . vault . modify ( file , output _content ) ;
2023-11-10 10:46:38 +08:00
if ( active _editor && active _editor . editor ) {
const editor = active _editor . editor ;
editor . setSelection ( { line : 0 , ch : 0 } , { line : 0 , ch : 0 } ) ;
}
2023-09-05 17:29:16 +08:00
app . workspace . trigger ( "templater:new-note-from-template" , {
file ,
content : output _content
2022-08-24 16:29:06 +08:00
} ) ;
2023-09-05 17:29:16 +08:00
await this . plugin . editor _handler . jump _to _next _cursor _location ( file , true ) ;
2022-08-24 16:29:06 +08:00
}
overwrite _active _file _commands ( ) {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . file ) {
log _error ( new TemplaterError ( "Active editor is null, can't overwrite content" ) ) ;
2022-08-24 16:29:06 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
this . overwrite _file _commands ( active _editor . file , true ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async overwrite _file _commands ( file , active _file = false ) {
const running _config = this . create _running _config ( file , file , active _file ? 3 : 2 ) ;
const output _content = await errorWrapper ( async ( ) => this . read _and _parse _template ( running _config ) , "Template parsing error, aborting." ) ;
if ( output _content == null ) {
return ;
}
await app . vault . modify ( file , output _content ) ;
app . workspace . trigger ( "templater:overwrite-file" , {
file ,
content : output _content
2022-08-24 16:29:06 +08:00
} ) ;
2023-09-05 17:29:16 +08:00
await this . plugin . editor _handler . jump _to _next _cursor _location ( file , true ) ;
}
async process _dynamic _templates ( el , ctx ) {
const dynamic _command _regex = generate _dynamic _command _regex ( ) ;
const walker = document . createNodeIterator ( el , NodeFilter . SHOW _TEXT ) ;
let node ;
let pass = false ;
let functions _object ;
while ( node = walker . nextNode ( ) ) {
let content = node . nodeValue ;
if ( content !== null ) {
let match = dynamic _command _regex . exec ( content ) ;
if ( match !== null ) {
const file = app . metadataCache . getFirstLinkpathDest ( "" , ctx . sourcePath ) ;
2023-11-10 10:46:38 +08:00
if ( ! file || ! ( file instanceof import _obsidian12 . TFile ) ) {
2022-08-24 16:29:06 +08:00
return ;
}
if ( ! pass ) {
pass = true ;
2023-09-05 17:29:16 +08:00
const config = this . create _running _config ( file , file , 4 ) ;
functions _object = await this . functions _generator . generate _object ( config , FunctionsMode . USER _INTERNAL ) ;
2022-08-24 16:29:06 +08:00
this . current _functions _object = functions _object ;
}
2023-09-05 17:29:16 +08:00
}
while ( match != null ) {
const complete _command = match [ 1 ] + match [ 2 ] ;
const command _output = await errorWrapper ( async ( ) => {
return await this . parser . parse _commands ( complete _command , functions _object ) ;
} , ` Command Parsing error in dynamic command ' ${ complete _command } ' ` ) ;
if ( command _output == null ) {
return ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const start2 = dynamic _command _regex . lastIndex - match [ 0 ] . length ;
const end2 = dynamic _command _regex . lastIndex ;
content = content . substring ( 0 , start2 ) + command _output + content . substring ( end2 ) ;
dynamic _command _regex . lastIndex += command _output . length - match [ 0 ] . length ;
match = dynamic _command _regex . exec ( content ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
node . nodeValue = content ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
2022-08-24 16:29:06 +08:00
}
get _new _file _template _for _folder ( folder ) {
do {
const match = this . plugin . settings . folder _templates . find ( ( e ) => e . folder == folder . path ) ;
if ( match && match . template ) {
return match . template ;
}
folder = folder . parent ;
} while ( folder ) ;
}
2023-09-05 17:29:16 +08:00
static async on _file _creation ( templater , file ) {
2023-11-10 10:46:38 +08:00
if ( ! ( file instanceof import _obsidian12 . TFile ) || file . extension !== "md" ) {
2023-09-05 17:29:16 +08:00
return ;
}
2023-11-10 10:46:38 +08:00
const template _folder = ( 0 , import _obsidian12 . normalizePath ) ( templater . plugin . settings . templates _folder ) ;
2023-09-05 17:29:16 +08:00
if ( file . path . includes ( template _folder ) && template _folder !== "/" ) {
return ;
}
await delay ( 300 ) ;
if ( file . stat . size == 0 && templater . plugin . settings . enable _folder _templates ) {
const folder _template _match = templater . get _new _file _template _for _folder ( file . parent ) ;
if ( ! folder _template _match ) {
2022-08-24 16:29:06 +08:00
return ;
}
2023-09-05 17:29:16 +08:00
const template _file = await errorWrapper ( async ( ) => {
return resolve _tfile ( folder _template _match ) ;
} , ` Couldn't find template ${ folder _template _match } ` ) ;
if ( template _file == null ) {
2022-08-24 16:29:06 +08:00
return ;
}
2023-09-05 17:29:16 +08:00
await templater . write _template _to _file ( template _file , file ) ;
} else {
if ( file . stat . size <= 1e5 ) {
await templater . overwrite _file _commands ( file ) ;
2022-08-24 16:29:06 +08:00
} else {
2023-09-05 17:29:16 +08:00
console . log ( ` Templater skipped parsing ${ file . path } because file size exceeds 10000 ` ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
}
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async execute _startup _scripts ( ) {
for ( const template of this . plugin . settings . startup _templates ) {
if ( ! template ) {
continue ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const file = errorWrapperSync ( ( ) => resolve _tfile ( template ) , ` Couldn't find startup template " ${ template } " ` ) ;
if ( ! file ) {
continue ;
}
const running _config = this . create _running _config ( file , file , 5 ) ;
await errorWrapper ( async ( ) => this . read _and _parse _template ( running _config ) , ` Startup Template parsing error, aborting. ` ) ;
}
2022-08-24 16:29:06 +08:00
}
} ;
// src/handlers/EventHandler.ts
2023-11-10 10:46:38 +08:00
var import _obsidian13 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
var EventHandler = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin , templater , settings ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
this . templater = templater ;
this . settings = settings ;
}
setup ( ) {
2023-09-05 17:29:16 +08:00
app . workspace . onLayoutReady ( ( ) => {
2022-08-24 16:29:06 +08:00
this . update _trigger _file _on _creation ( ) ;
} ) ;
this . update _syntax _highlighting ( ) ;
this . update _file _menu ( ) ;
}
update _syntax _highlighting ( ) {
2023-10-17 15:38:39 +08:00
const desktopShouldHighlight = this . plugin . editor _handler . desktopShouldHighlight ( ) ;
const mobileShouldHighlight = this . plugin . editor _handler . mobileShouldHighlight ( ) ;
if ( desktopShouldHighlight || mobileShouldHighlight ) {
2023-09-05 17:29:16 +08:00
this . syntax _highlighting _event = app . workspace . on ( "codemirror" , ( cm ) => {
2022-08-24 16:29:06 +08:00
cm . setOption ( "mode" , "templater" ) ;
} ) ;
2023-09-05 17:29:16 +08:00
app . workspace . iterateCodeMirrors ( ( cm ) => {
2022-08-24 16:29:06 +08:00
cm . setOption ( "mode" , "templater" ) ;
} ) ;
this . plugin . registerEvent ( this . syntax _highlighting _event ) ;
} else {
if ( this . syntax _highlighting _event ) {
2023-09-05 17:29:16 +08:00
app . vault . offref ( this . syntax _highlighting _event ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
app . workspace . iterateCodeMirrors ( ( cm ) => {
2022-08-24 16:29:06 +08:00
cm . setOption ( "mode" , "hypermd" ) ;
} ) ;
}
}
update _trigger _file _on _creation ( ) {
if ( this . settings . trigger _on _file _creation ) {
2023-09-05 17:29:16 +08:00
this . trigger _on _file _creation _event = app . vault . on ( "create" , ( file ) => Templater . on _file _creation ( this . templater , file ) ) ;
2022-08-24 16:29:06 +08:00
this . plugin . registerEvent ( this . trigger _on _file _creation _event ) ;
} else {
if ( this . trigger _on _file _creation _event ) {
2023-09-05 17:29:16 +08:00
app . vault . offref ( this . trigger _on _file _creation _event ) ;
2022-08-24 16:29:06 +08:00
this . trigger _on _file _creation _event = void 0 ;
}
}
}
update _file _menu ( ) {
2023-09-05 17:29:16 +08:00
this . plugin . registerEvent ( app . workspace . on ( "file-menu" , ( menu , file ) => {
2023-11-10 10:46:38 +08:00
if ( file instanceof import _obsidian13 . TFolder ) {
2022-08-24 16:29:06 +08:00
menu . addItem ( ( item ) => {
item . setTitle ( "Create new note from template" ) . setIcon ( "templater-icon" ) . onClick ( ( ) => {
this . plugin . fuzzy _suggester . create _new _note _from _template ( file ) ;
} ) ;
} ) ;
}
} ) ) ;
}
} ;
// src/handlers/CommandHandler.ts
var CommandHandler = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
}
setup ( ) {
this . plugin . addCommand ( {
id : "insert-templater" ,
name : "Open Insert Template modal" ,
hotkeys : [
{
modifiers : [ "Alt" ] ,
key : "e"
}
] ,
callback : ( ) => {
this . plugin . fuzzy _suggester . insert _template ( ) ;
}
} ) ;
this . plugin . addCommand ( {
id : "replace-in-file-templater" ,
name : "Replace templates in the active file" ,
hotkeys : [
{
modifiers : [ "Alt" ] ,
key : "r"
}
] ,
callback : ( ) => {
this . plugin . templater . overwrite _active _file _commands ( ) ;
}
} ) ;
this . plugin . addCommand ( {
id : "jump-to-next-cursor-location" ,
name : "Jump to next cursor location" ,
hotkeys : [
{
modifiers : [ "Alt" ] ,
key : "Tab"
}
] ,
callback : ( ) => {
this . plugin . editor _handler . jump _to _next _cursor _location ( ) ;
}
} ) ;
this . plugin . addCommand ( {
id : "create-new-note-from-template" ,
name : "Create new note from template" ,
hotkeys : [
{
modifiers : [ "Alt" ] ,
key : "n"
}
] ,
callback : ( ) => {
this . plugin . fuzzy _suggester . create _new _note _from _template ( ) ;
}
} ) ;
this . register _templates _hotkeys ( ) ;
}
register _templates _hotkeys ( ) {
this . plugin . settings . enabled _templates _hotkeys . forEach ( ( template ) => {
if ( template ) {
this . add _template _hotkey ( null , template ) ;
}
} ) ;
}
add _template _hotkey ( old _template , new _template ) {
this . remove _template _hotkey ( old _template ) ;
if ( new _template ) {
this . plugin . addCommand ( {
id : new _template ,
name : ` Insert ${ new _template } ` ,
callback : ( ) => {
2023-09-05 17:29:16 +08:00
const template = errorWrapperSync ( ( ) => resolve _tfile ( new _template ) , ` Couldn't find the template file associated with this hotkey ` ) ;
2022-08-24 16:29:06 +08:00
if ( ! template ) {
return ;
}
this . plugin . templater . append _template _to _active _file ( template ) ;
}
} ) ;
}
}
remove _template _hotkey ( template ) {
if ( template ) {
2023-09-05 17:29:16 +08:00
app . commands . removeCommand ( ` ${ this . plugin . manifest . id } : ${ template } ` ) ;
2022-08-24 16:29:06 +08:00
}
}
} ;
// src/editor/Editor.ts
2023-10-17 15:38:39 +08:00
var import _obsidian16 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
// src/editor/CursorJumper.ts
2023-11-10 10:46:38 +08:00
var import _obsidian14 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
var CursorJumper = class {
2023-09-05 17:29:16 +08:00
constructor ( ) {
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async jump _to _next _cursor _location ( ) {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . editor ) {
2023-09-05 17:29:16 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
const content = active _editor . editor . getValue ( ) ;
2023-09-05 17:29:16 +08:00
const { new _content , positions } = this . replace _and _get _cursor _positions ( content ) ;
if ( positions ) {
2023-11-10 10:46:38 +08:00
const fold _info = active _editor instanceof import _obsidian14 . MarkdownView ? active _editor . currentMode . getFoldInfo ( ) : null ;
2023-10-17 15:38:39 +08:00
active _editor . editor . setValue ( new _content ) ;
2023-11-10 10:46:38 +08:00
if ( fold _info && Array . isArray ( fold _info . folds ) ) {
positions . forEach ( ( position ) => {
fold _info . folds = fold _info . folds . filter ( ( fold ) => fold . from > position . line || fold . to < position . line ) ;
} ) ;
if ( active _editor instanceof import _obsidian14 . MarkdownView ) {
active _editor . currentMode . applyFoldInfo ( fold _info ) ;
}
}
2023-09-05 17:29:16 +08:00
this . set _cursor _location ( positions ) ;
}
if ( app . vault . getConfig ( "vimMode" ) ) {
2023-10-17 15:38:39 +08:00
const cm = active _editor . editor . cm . cm ;
2023-09-05 17:29:16 +08:00
window . CodeMirrorAdapter . Vim . handleKey ( cm , "i" , "mapping" ) ;
}
2022-08-24 16:29:06 +08:00
}
get _editor _position _from _index ( content , index ) {
const substr = content . slice ( 0 , index ) ;
let l = 0 ;
let offset2 = - 1 ;
let r = - 1 ;
for ( ; ( r = substr . indexOf ( "\n" , r + 1 ) ) !== - 1 ; l ++ , offset2 = r )
;
offset2 += 1 ;
const ch = content . slice ( offset2 , index ) . length ;
return { line : l , ch } ;
}
replace _and _get _cursor _positions ( content ) {
let cursor _matches = [ ] ;
let match ;
2023-10-17 15:38:39 +08:00
const cursor _regex = new RegExp ( "<%\\s*tp.file.cursor\\((?<order>[0-9]*)\\)\\s*%>" , "g" ) ;
2022-08-24 16:29:06 +08:00
while ( ( match = cursor _regex . exec ( content ) ) != null ) {
cursor _matches . push ( match ) ;
}
if ( cursor _matches . length === 0 ) {
return { } ;
}
cursor _matches . sort ( ( m1 , m2 ) => {
2023-09-05 17:29:16 +08:00
return Number ( m1 . groups && m1 . groups [ "order" ] ) - Number ( m2 . groups && m2 . groups [ "order" ] ) ;
2022-08-24 16:29:06 +08:00
} ) ;
const match _str = cursor _matches [ 0 ] [ 0 ] ;
cursor _matches = cursor _matches . filter ( ( m ) => {
return m [ 0 ] === match _str ;
} ) ;
const positions = [ ] ;
let index _offset = 0 ;
for ( const match2 of cursor _matches ) {
const index = match2 . index - index _offset ;
positions . push ( this . get _editor _position _from _index ( content , index ) ) ;
content = content . replace ( new RegExp ( escape _RegExp ( match2 [ 0 ] ) ) , "" ) ;
index _offset += match2 [ 0 ] . length ;
if ( match2 [ 1 ] === "" ) {
break ;
}
}
return { new _content : content , positions } ;
}
set _cursor _location ( positions ) {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . editor ) {
2022-08-24 16:29:06 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
const editor = active _editor . editor ;
2022-08-24 16:29:06 +08:00
const selections = [ ] ;
for ( const pos of positions ) {
selections . push ( { from : pos } ) ;
}
const transaction = {
selections
} ;
editor . transaction ( transaction ) ;
}
} ;
// src/editor/Autocomplete.ts
2023-10-17 15:38:39 +08:00
var import _obsidian15 = _ _toModule ( require ( "obsidian" ) ) ;
2022-08-24 16:29:06 +08:00
2023-09-05 17:29:16 +08:00
// toml:/home/runner/work/Templater/Templater/docs/documentation.toml
2023-10-17 15:38:39 +08:00
var tp = { config : { name : "config" , description : "This module exposes Templater's running configuration.\n\nThis is mostly useful when writing scripts requiring some context information.\n" , functions : { template _file : { name : "template_file" , description : "The `TFile` object representing the template file." , definition : "tp.config.template_file" } , target _file : { name : "target_file" , description : "The `TFile` object representing the target file where the template will be inserted." , definition : "tp.config.target_file" } , run _mode : { name : "run_mode" , description : "The `RunMode`, representing the way Templater was launched (Create new from template, Append to active file, ...)" , definition : "tp.config.run_mode" } , active _file : { name : "active_file" , description : "The active file (if existing) when launching Templater." , definition : "tp.config.active_file?" } } } , date : { name : "date" , description : "This module contains every internal function related to dates." , functions : { now : { name : "now" , description : "Retrieves the date." , definition : 'tp.date.now(format: string = "YYYY-MM-DD", offset?: number\u23AEstring, reference?: string, reference_format?: string)' , args : [ { name : "format" , description : "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } , { name : "offset" , description : "Offset for the day, e.g. set this to `-7` to get last week's date. You can also specify the offset as a string using the ISO 8601 format" } , { name : "reference" , description : "The date referential, e.g. set this to the note's title" } , { name : "reference_format" , description : "The date reference format." } ] } , tomorrow : { name : "tomorrow" , description : "Retrieves tomorrow's date." , definition : 'tp.date.tomorrow(format: string = "YYYY-MM-DD")' , args : [ { name : "format" , description : "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } ] } , yesterday : { name : "yesterday" , description : "Retrieves yesterday's date." , definition : 'tp.date.yesterday(format: string = "YYYY-MM-DD")' , args : [ { name : "format" , description : "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } ] } , weekday : { name : "weekday" , description : "" , definition : 'tp.date.weekday(format: string = "YYYY-MM-DD", weekday: number, reference?: string, reference_format?: string)' , args : [ { name : "format" , description : "Format for the date, refer to [format reference](https://momentjs.com/docs/#/displaying/format/)" } , { name : "weekday" , description : "Week day number. If the locale assigns Monday as the first day of the week, `0` will be Monday, `-7` will be last week's day." } , { name : "reference" , description : "The date referential, e.g. set this to the note's title" } , { name : "reference_format" , description : "The date reference format." } ] } } } , file : { name : "file" , description : "This module contains every internal function related to files." , functions : { content : { name : "content" , description : "Retrieves the file's content" , definition : "tp.file.content" } , create _new : { name : "create_new" , description : "Creates a new file using a specified template or with a specified content." , definition : "tp.file.create_new(template: TFile \u23AE string, filename?: string, open_new: boolean = false, folder?: TFolder)" , args : [ { name : "template" , description : "Either the template used for the new file content, or the file content as a string. If it is the template to use, you retrieve it with `tp.file.find_tfile(TEMPLATENAME)`" } , { name : "filename" , description : 'The filename of the new file, defaults to "Untitled".' } , { name : "open_new" , description : "Whether to open or not the newly created file. Warning: if you use this option, since commands are executed asynchronously, the file can be opened first and then other commands are appended to that new file and not the previous file." } , { name : "folder" , description : 'The folder to put the new file in, defaults to obsidian\' s default location . If you want the file to appear in a different folder , spe
2022-08-24 16:29:06 +08:00
var documentation _default = { tp } ;
// src/editor/TpDocumentation.ts
2023-09-05 17:29:16 +08:00
var module _names = [
"config" ,
"date" ,
"file" ,
"frontmatter" ,
"obsidian" ,
"system" ,
"user" ,
"web"
] ;
2022-08-24 16:29:06 +08:00
var module _names _checker = new Set ( module _names ) ;
function is _module _name ( x ) {
return typeof x === "string" && module _names _checker . has ( x ) ;
}
function is _function _documentation ( x ) {
if ( x . definition ) {
return true ;
}
return false ;
}
var Documentation = class {
2023-10-17 15:38:39 +08:00
constructor ( settings ) {
this . settings = settings ;
2022-08-24 16:29:06 +08:00
this . documentation = documentation _default ;
}
get _all _modules _documentation ( ) {
return Object . values ( this . documentation . tp ) ;
}
get _all _functions _documentation ( module _name ) {
2023-10-17 15:38:39 +08:00
if ( module _name === "user" ) {
if ( ! this . settings || ! this . settings . user _scripts _folder )
return ;
const files = errorWrapperSync ( ( ) => get _tfiles _from _folder ( this . settings . user _scripts _folder ) , ` User Scripts folder doesn't exist ` ) ;
if ( ! files || files . length === 0 )
return ;
return files . reduce ( ( processedFiles , file ) => {
if ( file . extension !== "js" )
return processedFiles ;
return [
... processedFiles ,
{
name : file . basename ,
definition : "" ,
description : "" ,
example : ""
}
] ;
} , [ ] ) ;
}
2022-08-24 16:29:06 +08:00
if ( ! this . documentation . tp [ module _name ] . functions ) {
2023-09-05 17:29:16 +08:00
return ;
2022-08-24 16:29:06 +08:00
}
return Object . values ( this . documentation . tp [ module _name ] . functions ) ;
}
get _module _documentation ( module _name ) {
return this . documentation . tp [ module _name ] ;
}
get _function _documentation ( module _name , function _name ) {
return this . documentation . tp [ module _name ] . functions [ function _name ] ;
}
get _argument _documentation ( module _name , function _name , argument _name ) {
const function _doc = this . get _function _documentation ( module _name , function _name ) ;
if ( ! function _doc || ! function _doc . args ) {
return null ;
}
return function _doc . args [ argument _name ] ;
}
} ;
// src/editor/Autocomplete.ts
2023-10-17 15:38:39 +08:00
var Autocomplete = class extends import _obsidian15 . EditorSuggest {
constructor ( settings ) {
2022-08-24 16:29:06 +08:00
super ( app ) ;
this . tp _keyword _regex = /tp\.(?<module>[a-z]*)?(?<fn_trigger>\.(?<fn>[a-z_]*)?)?$/ ;
2023-10-17 15:38:39 +08:00
this . documentation = new Documentation ( settings ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
onTrigger ( cursor , editor , _file ) {
2022-08-24 16:29:06 +08:00
const range = editor . getRange ( { line : cursor . line , ch : 0 } , { line : cursor . line , ch : cursor . ch } ) ;
const match = this . tp _keyword _regex . exec ( range ) ;
if ( ! match ) {
return null ;
}
let query ;
2023-09-05 17:29:16 +08:00
const module _name = match . groups && match . groups [ "module" ] || "" ;
2022-08-24 16:29:06 +08:00
this . module _name = module _name ;
2023-09-05 17:29:16 +08:00
if ( match . groups && match . groups [ "fn_trigger" ] ) {
2022-08-24 16:29:06 +08:00
if ( module _name == "" || ! is _module _name ( module _name ) ) {
2023-09-05 17:29:16 +08:00
return null ;
2022-08-24 16:29:06 +08:00
}
this . function _trigger = true ;
this . function _name = match . groups [ "fn" ] || "" ;
query = this . function _name ;
} else {
this . function _trigger = false ;
query = this . module _name ;
}
const trigger _info = {
start : { line : cursor . line , ch : cursor . ch - query . length } ,
end : { line : cursor . line , ch : cursor . ch } ,
query
} ;
this . latest _trigger _info = trigger _info ;
return trigger _info ;
}
getSuggestions ( context ) {
let suggestions ;
if ( this . module _name && this . function _trigger ) {
suggestions = this . documentation . get _all _functions _documentation ( this . module _name ) ;
} else {
suggestions = this . documentation . get _all _modules _documentation ( ) ;
}
if ( ! suggestions ) {
return [ ] ;
}
return suggestions . filter ( ( s ) => s . name . startsWith ( context . query ) ) ;
}
renderSuggestion ( value , el ) {
el . createEl ( "b" , { text : value . name } ) ;
el . createEl ( "br" ) ;
if ( this . function _trigger && is _function _documentation ( value ) ) {
el . createEl ( "code" , { text : value . definition } ) ;
}
if ( value . description ) {
el . createEl ( "div" , { text : value . description } ) ;
}
}
2023-09-05 17:29:16 +08:00
selectSuggestion ( value , _evt ) {
2023-10-17 15:38:39 +08:00
const active _editor = app . workspace . activeEditor ;
if ( ! active _editor || ! active _editor . editor ) {
2022-08-24 16:29:06 +08:00
return ;
}
2023-10-17 15:38:39 +08:00
active _editor . editor . replaceRange ( value . name , this . latest _trigger _info . start , this . latest _trigger _info . end ) ;
2022-08-24 16:29:06 +08:00
if ( this . latest _trigger _info . start . ch == this . latest _trigger _info . end . ch ) {
const cursor _pos = this . latest _trigger _info . end ;
cursor _pos . ch += value . name . length ;
2023-10-17 15:38:39 +08:00
active _editor . editor . setCursor ( cursor _pos ) ;
2022-08-24 16:29:06 +08:00
}
}
} ;
// src/editor/mode/javascript.js
( function ( mod ) {
mod ( window . CodeMirror ) ;
} ) ( function ( CodeMirror ) {
"use strict" ;
2023-09-05 17:29:16 +08:00
CodeMirror . defineMode ( "javascript" , function ( config , parserConfig ) {
var indentUnit = config . indentUnit ;
2022-08-24 16:29:06 +08:00
var statementIndent = parserConfig . statementIndent ;
var jsonldMode = parserConfig . jsonld ;
var jsonMode = parserConfig . json || jsonldMode ;
var trackScope = parserConfig . trackScope !== false ;
var isTS = parserConfig . typescript ;
var wordRE = parserConfig . wordCharacters || /[\w$\xa1-\uffff]/ ;
var keywords = function ( ) {
function kw ( type2 ) {
return { type : type2 , style : "keyword" } ;
}
var A = kw ( "keyword a" ) , B = kw ( "keyword b" ) , C = kw ( "keyword c" ) , D = kw ( "keyword d" ) ;
var operator = kw ( "operator" ) , atom = { type : "atom" , style : "atom" } ;
return {
if : kw ( "if" ) ,
while : A ,
with : A ,
else : B ,
do : B ,
try : B ,
finally : B ,
return : D ,
break : D ,
continue : D ,
new : kw ( "new" ) ,
delete : C ,
void : C ,
throw : C ,
debugger : kw ( "debugger" ) ,
var : kw ( "var" ) ,
const : kw ( "var" ) ,
let : kw ( "var" ) ,
function : kw ( "function" ) ,
catch : kw ( "catch" ) ,
for : kw ( "for" ) ,
switch : kw ( "switch" ) ,
case : kw ( "case" ) ,
default : kw ( "default" ) ,
in : operator ,
typeof : operator ,
instanceof : operator ,
true : atom ,
false : atom ,
null : atom ,
undefined : atom ,
NaN : atom ,
Infinity : atom ,
this : kw ( "this" ) ,
class : kw ( "class" ) ,
super : kw ( "atom" ) ,
yield : C ,
export : kw ( "export" ) ,
import : kw ( "import" ) ,
extends : C ,
await : C
} ;
} ( ) ;
var isOperatorChar = /[+\-*&%=<>!?|~^@]/ ;
var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/ ;
function readRegexp ( stream ) {
var escaped = false , next , inSet = false ;
while ( ( next = stream . next ( ) ) != null ) {
if ( ! escaped ) {
if ( next == "/" && ! inSet )
return ;
if ( next == "[" )
inSet = true ;
else if ( inSet && next == "]" )
inSet = false ;
}
escaped = ! escaped && next == "\\" ;
}
}
var type , content ;
function ret ( tp2 , style , cont2 ) {
type = tp2 ;
content = cont2 ;
return style ;
}
function tokenBase ( stream , state ) {
var ch = stream . next ( ) ;
if ( ch == '"' || ch == "'" ) {
state . tokenize = tokenString ( ch ) ;
return state . tokenize ( stream , state ) ;
} else if ( ch == "." && stream . match ( /^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/ ) ) {
return ret ( "number" , "number" ) ;
} else if ( ch == "." && stream . match ( ".." ) ) {
return ret ( "spread" , "meta" ) ;
} else if ( /[\[\]{}\(\),;\:\.]/ . test ( ch ) ) {
return ret ( ch ) ;
} else if ( ch == "=" && stream . eat ( ">" ) ) {
return ret ( "=>" , "operator" ) ;
} else if ( ch == "0" && stream . match ( /^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/ ) ) {
return ret ( "number" , "number" ) ;
} else if ( /\d/ . test ( ch ) ) {
stream . match ( /^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/ ) ;
return ret ( "number" , "number" ) ;
} else if ( ch == "/" ) {
if ( stream . eat ( "*" ) ) {
state . tokenize = tokenComment ;
return tokenComment ( stream , state ) ;
} else if ( stream . eat ( "/" ) ) {
stream . skipToEnd ( ) ;
return ret ( "comment" , "comment" ) ;
} else if ( expressionAllowed ( stream , state , 1 ) ) {
readRegexp ( stream ) ;
stream . match ( /^\b(([gimyus])(?![gimyus]*\2))+\b/ ) ;
return ret ( "regexp" , "string-2" ) ;
} else {
stream . eat ( "=" ) ;
return ret ( "operator" , "operator" , stream . current ( ) ) ;
}
} else if ( ch == "`" ) {
state . tokenize = tokenQuasi ;
return tokenQuasi ( stream , state ) ;
} else if ( ch == "#" && stream . peek ( ) == "!" ) {
stream . skipToEnd ( ) ;
return ret ( "meta" , "meta" ) ;
} else if ( ch == "#" && stream . eatWhile ( wordRE ) ) {
return ret ( "variable" , "property" ) ;
} else if ( ch == "<" && stream . match ( "!--" ) || ch == "-" && stream . match ( "->" ) && ! /\S/ . test ( stream . string . slice ( 0 , stream . start ) ) ) {
stream . skipToEnd ( ) ;
return ret ( "comment" , "comment" ) ;
} else if ( isOperatorChar . test ( ch ) ) {
if ( ch != ">" || ! state . lexical || state . lexical . type != ">" ) {
if ( stream . eat ( "=" ) ) {
if ( ch == "!" || ch == "=" )
stream . eat ( "=" ) ;
} else if ( /[<>*+\-|&?]/ . test ( ch ) ) {
stream . eat ( ch ) ;
if ( ch == ">" )
stream . eat ( ch ) ;
}
}
if ( ch == "?" && stream . eat ( "." ) )
return ret ( "." ) ;
return ret ( "operator" , "operator" , stream . current ( ) ) ;
} else if ( wordRE . test ( ch ) ) {
stream . eatWhile ( wordRE ) ;
var word = stream . current ( ) ;
if ( state . lastType != "." ) {
if ( keywords . propertyIsEnumerable ( word ) ) {
var kw = keywords [ word ] ;
return ret ( kw . type , kw . style , word ) ;
}
if ( word == "async" && stream . match ( /^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/ , false ) )
return ret ( "async" , "keyword" , word ) ;
}
return ret ( "variable" , "variable" , word ) ;
}
}
function tokenString ( quote ) {
return function ( stream , state ) {
var escaped = false , next ;
if ( jsonldMode && stream . peek ( ) == "@" && stream . match ( isJsonldKeyword ) ) {
state . tokenize = tokenBase ;
return ret ( "jsonld-keyword" , "meta" ) ;
}
while ( ( next = stream . next ( ) ) != null ) {
if ( next == quote && ! escaped )
break ;
escaped = ! escaped && next == "\\" ;
}
if ( ! escaped )
state . tokenize = tokenBase ;
return ret ( "string" , "string" ) ;
} ;
}
function tokenComment ( stream , state ) {
var maybeEnd = false , ch ;
while ( ch = stream . next ( ) ) {
if ( ch == "/" && maybeEnd ) {
state . tokenize = tokenBase ;
break ;
}
maybeEnd = ch == "*" ;
}
return ret ( "comment" , "comment" ) ;
}
function tokenQuasi ( stream , state ) {
var escaped = false , next ;
while ( ( next = stream . next ( ) ) != null ) {
if ( ! escaped && ( next == "`" || next == "$" && stream . eat ( "{" ) ) ) {
state . tokenize = tokenBase ;
break ;
}
escaped = ! escaped && next == "\\" ;
}
return ret ( "quasi" , "string-2" , stream . current ( ) ) ;
}
var brackets = "([{}])" ;
function findFatArrow ( stream , state ) {
if ( state . fatArrowAt )
state . fatArrowAt = null ;
var arrow2 = stream . string . indexOf ( "=>" , stream . start ) ;
if ( arrow2 < 0 )
return ;
if ( isTS ) {
var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/ . exec ( stream . string . slice ( stream . start , arrow2 ) ) ;
if ( m )
arrow2 = m . index ;
}
var depth = 0 , sawSomething = false ;
for ( var pos = arrow2 - 1 ; pos >= 0 ; -- pos ) {
var ch = stream . string . charAt ( pos ) ;
var bracket = brackets . indexOf ( ch ) ;
if ( bracket >= 0 && bracket < 3 ) {
if ( ! depth ) {
++ pos ;
break ;
}
if ( -- depth == 0 ) {
if ( ch == "(" )
sawSomething = true ;
break ;
}
} else if ( bracket >= 3 && bracket < 6 ) {
++ depth ;
} else if ( wordRE . test ( ch ) ) {
sawSomething = true ;
} else if ( /["'\/`]/ . test ( ch ) ) {
for ( ; ; -- pos ) {
if ( pos == 0 )
return ;
var next = stream . string . charAt ( pos - 1 ) ;
if ( next == ch && stream . string . charAt ( pos - 2 ) != "\\" ) {
pos -- ;
break ;
}
}
} else if ( sawSomething && ! depth ) {
++ pos ;
break ;
}
}
if ( sawSomething && ! depth )
state . fatArrowAt = pos ;
}
var atomicTypes = {
atom : true ,
number : true ,
variable : true ,
string : true ,
regexp : true ,
this : true ,
import : true ,
"jsonld-keyword" : true
} ;
function JSLexical ( indented , column , type2 , align , prev , info ) {
this . indented = indented ;
this . column = column ;
this . type = type2 ;
this . prev = prev ;
this . info = info ;
if ( align != null )
this . align = align ;
}
function inScope ( state , varname ) {
if ( ! trackScope )
return false ;
for ( var v = state . localVars ; v ; v = v . next )
if ( v . name == varname )
return true ;
for ( var cx2 = state . context ; cx2 ; cx2 = cx2 . prev ) {
for ( var v = cx2 . vars ; v ; v = v . next )
if ( v . name == varname )
return true ;
}
}
function parseJS ( state , style , type2 , content2 , stream ) {
var cc = state . cc ;
cx . state = state ;
cx . stream = stream ;
cx . marked = null , cx . cc = cc ;
cx . style = style ;
if ( ! state . lexical . hasOwnProperty ( "align" ) )
state . lexical . align = true ;
while ( true ) {
var combinator = cc . length ? cc . pop ( ) : jsonMode ? expression : statement ;
if ( combinator ( type2 , content2 ) ) {
while ( cc . length && cc [ cc . length - 1 ] . lex )
cc . pop ( ) ( ) ;
if ( cx . marked )
return cx . marked ;
if ( type2 == "variable" && inScope ( state , content2 ) )
return "variable-2" ;
return style ;
}
}
}
var cx = { state : null , column : null , marked : null , cc : null } ;
function pass ( ) {
for ( var i = arguments . length - 1 ; i >= 0 ; i -- )
cx . cc . push ( arguments [ i ] ) ;
}
function cont ( ) {
pass . apply ( null , arguments ) ;
return true ;
}
function inList ( name , list ) {
for ( var v = list ; v ; v = v . next )
if ( v . name == name )
return true ;
return false ;
}
function register ( varname ) {
var state = cx . state ;
cx . marked = "def" ;
if ( ! trackScope )
return ;
if ( state . context ) {
if ( state . lexical . info == "var" && state . context && state . context . block ) {
var newContext = registerVarScoped ( varname , state . context ) ;
if ( newContext != null ) {
state . context = newContext ;
return ;
}
} else if ( ! inList ( varname , state . localVars ) ) {
state . localVars = new Var ( varname , state . localVars ) ;
return ;
}
}
if ( parserConfig . globalVars && ! inList ( varname , state . globalVars ) )
state . globalVars = new Var ( varname , state . globalVars ) ;
}
function registerVarScoped ( varname , context ) {
if ( ! context ) {
return null ;
} else if ( context . block ) {
var inner = registerVarScoped ( varname , context . prev ) ;
if ( ! inner )
return null ;
if ( inner == context . prev )
return context ;
return new Context ( inner , context . vars , true ) ;
} else if ( inList ( varname , context . vars ) ) {
return context ;
} else {
return new Context ( context . prev , new Var ( varname , context . vars ) , false ) ;
}
}
function isModifier ( name ) {
return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" ;
}
function Context ( prev , vars , block2 ) {
this . prev = prev ;
this . vars = vars ;
this . block = block2 ;
}
function Var ( name , next ) {
this . name = name ;
this . next = next ;
}
var defaultVars = new Var ( "this" , new Var ( "arguments" , null ) ) ;
function pushcontext ( ) {
cx . state . context = new Context ( cx . state . context , cx . state . localVars , false ) ;
cx . state . localVars = defaultVars ;
}
function pushblockcontext ( ) {
cx . state . context = new Context ( cx . state . context , cx . state . localVars , true ) ;
cx . state . localVars = null ;
}
function popcontext ( ) {
cx . state . localVars = cx . state . context . vars ;
cx . state . context = cx . state . context . prev ;
}
popcontext . lex = true ;
function pushlex ( type2 , info ) {
var result = function ( ) {
var state = cx . state , indent = state . indented ;
if ( state . lexical . type == "stat" )
indent = state . lexical . indented ;
else
for ( var outer = state . lexical ; outer && outer . type == ")" && outer . align ; outer = outer . prev )
indent = outer . indented ;
state . lexical = new JSLexical ( indent , cx . stream . column ( ) , type2 , null , state . lexical , info ) ;
} ;
result . lex = true ;
return result ;
}
function poplex ( ) {
var state = cx . state ;
if ( state . lexical . prev ) {
if ( state . lexical . type == ")" )
state . indented = state . lexical . indented ;
state . lexical = state . lexical . prev ;
}
}
poplex . lex = true ;
function expect ( wanted ) {
function exp ( type2 ) {
if ( type2 == wanted )
return cont ( ) ;
else if ( wanted == ";" || type2 == "}" || type2 == ")" || type2 == "]" )
return pass ( ) ;
else
return cont ( exp ) ;
}
return exp ;
}
function statement ( type2 , value ) {
if ( type2 == "var" )
return cont ( pushlex ( "vardef" , value ) , vardef , expect ( ";" ) , poplex ) ;
if ( type2 == "keyword a" )
return cont ( pushlex ( "form" ) , parenExpr , statement , poplex ) ;
if ( type2 == "keyword b" )
return cont ( pushlex ( "form" ) , statement , poplex ) ;
if ( type2 == "keyword d" )
return cx . stream . match ( /^\s*$/ , false ) ? cont ( ) : cont ( pushlex ( "stat" ) , maybeexpression , expect ( ";" ) , poplex ) ;
if ( type2 == "debugger" )
return cont ( expect ( ";" ) ) ;
if ( type2 == "{" )
return cont ( pushlex ( "}" ) , pushblockcontext , block , poplex , popcontext ) ;
if ( type2 == ";" )
return cont ( ) ;
if ( type2 == "if" ) {
if ( cx . state . lexical . info == "else" && cx . state . cc [ cx . state . cc . length - 1 ] == poplex )
cx . state . cc . pop ( ) ( ) ;
return cont ( pushlex ( "form" ) , parenExpr , statement , poplex , maybeelse ) ;
}
if ( type2 == "function" )
return cont ( functiondef ) ;
if ( type2 == "for" )
return cont ( pushlex ( "form" ) , pushblockcontext , forspec , statement , popcontext , poplex ) ;
if ( type2 == "class" || isTS && value == "interface" ) {
cx . marked = "keyword" ;
return cont ( pushlex ( "form" , type2 == "class" ? type2 : value ) , className , poplex ) ;
}
if ( type2 == "variable" ) {
if ( isTS && value == "declare" ) {
cx . marked = "keyword" ;
return cont ( statement ) ;
} else if ( isTS && ( value == "module" || value == "enum" || value == "type" ) && cx . stream . match ( /^\s*\w/ , false ) ) {
cx . marked = "keyword" ;
if ( value == "enum" )
return cont ( enumdef ) ;
else if ( value == "type" )
return cont ( typename , expect ( "operator" ) , typeexpr , expect ( ";" ) ) ;
else
return cont ( pushlex ( "form" ) , pattern , expect ( "{" ) , pushlex ( "}" ) , block , poplex , poplex ) ;
} else if ( isTS && value == "namespace" ) {
cx . marked = "keyword" ;
return cont ( pushlex ( "form" ) , expression , statement , poplex ) ;
} else if ( isTS && value == "abstract" ) {
cx . marked = "keyword" ;
return cont ( statement ) ;
} else {
return cont ( pushlex ( "stat" ) , maybelabel ) ;
}
}
if ( type2 == "switch" )
return cont ( pushlex ( "form" ) , parenExpr , expect ( "{" ) , pushlex ( "}" , "switch" ) , pushblockcontext , block , poplex , poplex , popcontext ) ;
if ( type2 == "case" )
return cont ( expression , expect ( ":" ) ) ;
if ( type2 == "default" )
return cont ( expect ( ":" ) ) ;
if ( type2 == "catch" )
return cont ( pushlex ( "form" ) , pushcontext , maybeCatchBinding , statement , poplex , popcontext ) ;
if ( type2 == "export" )
return cont ( pushlex ( "stat" ) , afterExport , poplex ) ;
if ( type2 == "import" )
return cont ( pushlex ( "stat" ) , afterImport , poplex ) ;
if ( type2 == "async" )
return cont ( statement ) ;
if ( value == "@" )
return cont ( expression , statement ) ;
return pass ( pushlex ( "stat" ) , expression , expect ( ";" ) , poplex ) ;
}
function maybeCatchBinding ( type2 ) {
if ( type2 == "(" )
return cont ( funarg , expect ( ")" ) ) ;
}
function expression ( type2 , value ) {
return expressionInner ( type2 , value , false ) ;
}
function expressionNoComma ( type2 , value ) {
return expressionInner ( type2 , value , true ) ;
}
function parenExpr ( type2 ) {
if ( type2 != "(" )
return pass ( ) ;
return cont ( pushlex ( ")" ) , maybeexpression , expect ( ")" ) , poplex ) ;
}
function expressionInner ( type2 , value , noComma ) {
if ( cx . state . fatArrowAt == cx . stream . start ) {
var body = noComma ? arrowBodyNoComma : arrowBody ;
if ( type2 == "(" )
return cont ( pushcontext , pushlex ( ")" ) , commasep ( funarg , ")" ) , poplex , expect ( "=>" ) , body , popcontext ) ;
else if ( type2 == "variable" )
return pass ( pushcontext , pattern , expect ( "=>" ) , body , popcontext ) ;
}
var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma ;
if ( atomicTypes . hasOwnProperty ( type2 ) )
return cont ( maybeop ) ;
if ( type2 == "function" )
return cont ( functiondef , maybeop ) ;
if ( type2 == "class" || isTS && value == "interface" ) {
cx . marked = "keyword" ;
return cont ( pushlex ( "form" ) , classExpression , poplex ) ;
}
if ( type2 == "keyword c" || type2 == "async" )
return cont ( noComma ? expressionNoComma : expression ) ;
if ( type2 == "(" )
return cont ( pushlex ( ")" ) , maybeexpression , expect ( ")" ) , poplex , maybeop ) ;
if ( type2 == "operator" || type2 == "spread" )
return cont ( noComma ? expressionNoComma : expression ) ;
if ( type2 == "[" )
return cont ( pushlex ( "]" ) , arrayLiteral , poplex , maybeop ) ;
if ( type2 == "{" )
return contCommasep ( objprop , "}" , null , maybeop ) ;
if ( type2 == "quasi" )
return pass ( quasi , maybeop ) ;
if ( type2 == "new" )
return cont ( maybeTarget ( noComma ) ) ;
return cont ( ) ;
}
function maybeexpression ( type2 ) {
if ( type2 . match ( /[;\}\)\],]/ ) )
return pass ( ) ;
return pass ( expression ) ;
}
function maybeoperatorComma ( type2 , value ) {
if ( type2 == "," )
return cont ( maybeexpression ) ;
return maybeoperatorNoComma ( type2 , value , false ) ;
}
function maybeoperatorNoComma ( type2 , value , noComma ) {
var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma ;
var expr = noComma == false ? expression : expressionNoComma ;
if ( type2 == "=>" )
return cont ( pushcontext , noComma ? arrowBodyNoComma : arrowBody , popcontext ) ;
if ( type2 == "operator" ) {
if ( /\+\+|--/ . test ( value ) || isTS && value == "!" )
return cont ( me ) ;
if ( isTS && value == "<" && cx . stream . match ( /^([^<>]|<[^<>]*>)*>\s*\(/ , false ) )
return cont ( pushlex ( ">" ) , commasep ( typeexpr , ">" ) , poplex , me ) ;
if ( value == "?" )
return cont ( expression , expect ( ":" ) , expr ) ;
return cont ( expr ) ;
}
if ( type2 == "quasi" ) {
return pass ( quasi , me ) ;
}
if ( type2 == ";" )
return ;
if ( type2 == "(" )
return contCommasep ( expressionNoComma , ")" , "call" , me ) ;
if ( type2 == "." )
return cont ( property , me ) ;
if ( type2 == "[" )
return cont ( pushlex ( "]" ) , maybeexpression , expect ( "]" ) , poplex , me ) ;
if ( isTS && value == "as" ) {
cx . marked = "keyword" ;
return cont ( typeexpr , me ) ;
}
if ( type2 == "regexp" ) {
cx . state . lastType = cx . marked = "operator" ;
cx . stream . backUp ( cx . stream . pos - cx . stream . start - 1 ) ;
return cont ( expr ) ;
}
}
function quasi ( type2 , value ) {
if ( type2 != "quasi" )
return pass ( ) ;
if ( value . slice ( value . length - 2 ) != "${" )
return cont ( quasi ) ;
return cont ( maybeexpression , continueQuasi ) ;
}
function continueQuasi ( type2 ) {
if ( type2 == "}" ) {
cx . marked = "string-2" ;
cx . state . tokenize = tokenQuasi ;
return cont ( quasi ) ;
}
}
function arrowBody ( type2 ) {
findFatArrow ( cx . stream , cx . state ) ;
return pass ( type2 == "{" ? statement : expression ) ;
}
function arrowBodyNoComma ( type2 ) {
findFatArrow ( cx . stream , cx . state ) ;
return pass ( type2 == "{" ? statement : expressionNoComma ) ;
}
function maybeTarget ( noComma ) {
return function ( type2 ) {
if ( type2 == "." )
return cont ( noComma ? targetNoComma : target ) ;
else if ( type2 == "variable" && isTS )
return cont ( maybeTypeArgs , noComma ? maybeoperatorNoComma : maybeoperatorComma ) ;
else
return pass ( noComma ? expressionNoComma : expression ) ;
} ;
}
function target ( _ , value ) {
if ( value == "target" ) {
cx . marked = "keyword" ;
return cont ( maybeoperatorComma ) ;
}
}
function targetNoComma ( _ , value ) {
if ( value == "target" ) {
cx . marked = "keyword" ;
return cont ( maybeoperatorNoComma ) ;
}
}
function maybelabel ( type2 ) {
if ( type2 == ":" )
return cont ( poplex , statement ) ;
return pass ( maybeoperatorComma , expect ( ";" ) , poplex ) ;
}
function property ( type2 ) {
if ( type2 == "variable" ) {
cx . marked = "property" ;
return cont ( ) ;
}
}
function objprop ( type2 , value ) {
if ( type2 == "async" ) {
cx . marked = "property" ;
return cont ( objprop ) ;
} else if ( type2 == "variable" || cx . style == "keyword" ) {
cx . marked = "property" ;
if ( value == "get" || value == "set" )
return cont ( getterSetter ) ;
var m ;
if ( isTS && cx . state . fatArrowAt == cx . stream . start && ( m = cx . stream . match ( /^\s*:\s*/ , false ) ) )
cx . state . fatArrowAt = cx . stream . pos + m [ 0 ] . length ;
return cont ( afterprop ) ;
} else if ( type2 == "number" || type2 == "string" ) {
cx . marked = jsonldMode ? "property" : cx . style + " property" ;
return cont ( afterprop ) ;
} else if ( type2 == "jsonld-keyword" ) {
return cont ( afterprop ) ;
} else if ( isTS && isModifier ( value ) ) {
cx . marked = "keyword" ;
return cont ( objprop ) ;
} else if ( type2 == "[" ) {
return cont ( expression , maybetype , expect ( "]" ) , afterprop ) ;
} else if ( type2 == "spread" ) {
return cont ( expressionNoComma , afterprop ) ;
} else if ( value == "*" ) {
cx . marked = "keyword" ;
return cont ( objprop ) ;
} else if ( type2 == ":" ) {
return pass ( afterprop ) ;
}
}
function getterSetter ( type2 ) {
if ( type2 != "variable" )
return pass ( afterprop ) ;
cx . marked = "property" ;
return cont ( functiondef ) ;
}
function afterprop ( type2 ) {
if ( type2 == ":" )
return cont ( expressionNoComma ) ;
if ( type2 == "(" )
return pass ( functiondef ) ;
}
function commasep ( what , end2 , sep ) {
function proceed ( type2 , value ) {
if ( sep ? sep . indexOf ( type2 ) > - 1 : type2 == "," ) {
var lex = cx . state . lexical ;
if ( lex . info == "call" )
lex . pos = ( lex . pos || 0 ) + 1 ;
return cont ( function ( type3 , value2 ) {
if ( type3 == end2 || value2 == end2 )
return pass ( ) ;
return pass ( what ) ;
} , proceed ) ;
}
if ( type2 == end2 || value == end2 )
return cont ( ) ;
if ( sep && sep . indexOf ( ";" ) > - 1 )
return pass ( what ) ;
return cont ( expect ( end2 ) ) ;
}
return function ( type2 , value ) {
if ( type2 == end2 || value == end2 )
return cont ( ) ;
return pass ( what , proceed ) ;
} ;
}
function contCommasep ( what , end2 , info ) {
for ( var i = 3 ; i < arguments . length ; i ++ )
cx . cc . push ( arguments [ i ] ) ;
return cont ( pushlex ( end2 , info ) , commasep ( what , end2 ) , poplex ) ;
}
function block ( type2 ) {
if ( type2 == "}" )
return cont ( ) ;
return pass ( statement , block ) ;
}
function maybetype ( type2 , value ) {
if ( isTS ) {
if ( type2 == ":" )
return cont ( typeexpr ) ;
if ( value == "?" )
return cont ( maybetype ) ;
}
}
function maybetypeOrIn ( type2 , value ) {
if ( isTS && ( type2 == ":" || value == "in" ) )
return cont ( typeexpr ) ;
}
function mayberettype ( type2 ) {
if ( isTS && type2 == ":" ) {
if ( cx . stream . match ( /^\s*\w+\s+is\b/ , false ) )
return cont ( expression , isKW , typeexpr ) ;
else
return cont ( typeexpr ) ;
}
}
function isKW ( _ , value ) {
if ( value == "is" ) {
cx . marked = "keyword" ;
return cont ( ) ;
}
}
function typeexpr ( type2 , value ) {
if ( value == "keyof" || value == "typeof" || value == "infer" || value == "readonly" ) {
cx . marked = "keyword" ;
return cont ( value == "typeof" ? expressionNoComma : typeexpr ) ;
}
if ( type2 == "variable" || value == "void" ) {
cx . marked = "type" ;
return cont ( afterType ) ;
}
if ( value == "|" || value == "&" )
return cont ( typeexpr ) ;
if ( type2 == "string" || type2 == "number" || type2 == "atom" )
return cont ( afterType ) ;
if ( type2 == "[" )
return cont ( pushlex ( "]" ) , commasep ( typeexpr , "]" , "," ) , poplex , afterType ) ;
if ( type2 == "{" )
return cont ( pushlex ( "}" ) , typeprops , poplex , afterType ) ;
if ( type2 == "(" )
return cont ( commasep ( typearg , ")" ) , maybeReturnType , afterType ) ;
if ( type2 == "<" )
return cont ( commasep ( typeexpr , ">" ) , typeexpr ) ;
if ( type2 == "quasi" ) {
return pass ( quasiType , afterType ) ;
}
}
function maybeReturnType ( type2 ) {
if ( type2 == "=>" )
return cont ( typeexpr ) ;
}
function typeprops ( type2 ) {
if ( type2 . match ( /[\}\)\]]/ ) )
return cont ( ) ;
if ( type2 == "," || type2 == ";" )
return cont ( typeprops ) ;
return pass ( typeprop , typeprops ) ;
}
function typeprop ( type2 , value ) {
if ( type2 == "variable" || cx . style == "keyword" ) {
cx . marked = "property" ;
return cont ( typeprop ) ;
} else if ( value == "?" || type2 == "number" || type2 == "string" ) {
return cont ( typeprop ) ;
} else if ( type2 == ":" ) {
return cont ( typeexpr ) ;
} else if ( type2 == "[" ) {
return cont ( expect ( "variable" ) , maybetypeOrIn , expect ( "]" ) , typeprop ) ;
} else if ( type2 == "(" ) {
return pass ( functiondecl , typeprop ) ;
} else if ( ! type2 . match ( /[;\}\)\],]/ ) ) {
return cont ( ) ;
}
}
function quasiType ( type2 , value ) {
if ( type2 != "quasi" )
return pass ( ) ;
if ( value . slice ( value . length - 2 ) != "${" )
return cont ( quasiType ) ;
return cont ( typeexpr , continueQuasiType ) ;
}
function continueQuasiType ( type2 ) {
if ( type2 == "}" ) {
cx . marked = "string-2" ;
cx . state . tokenize = tokenQuasi ;
return cont ( quasiType ) ;
}
}
function typearg ( type2 , value ) {
if ( type2 == "variable" && cx . stream . match ( /^\s*[?:]/ , false ) || value == "?" )
return cont ( typearg ) ;
if ( type2 == ":" )
return cont ( typeexpr ) ;
if ( type2 == "spread" )
return cont ( typearg ) ;
return pass ( typeexpr ) ;
}
function afterType ( type2 , value ) {
if ( value == "<" )
return cont ( pushlex ( ">" ) , commasep ( typeexpr , ">" ) , poplex , afterType ) ;
if ( value == "|" || type2 == "." || value == "&" )
return cont ( typeexpr ) ;
if ( type2 == "[" )
return cont ( typeexpr , expect ( "]" ) , afterType ) ;
if ( value == "extends" || value == "implements" ) {
cx . marked = "keyword" ;
return cont ( typeexpr ) ;
}
if ( value == "?" )
return cont ( typeexpr , expect ( ":" ) , typeexpr ) ;
}
function maybeTypeArgs ( _ , value ) {
if ( value == "<" )
return cont ( pushlex ( ">" ) , commasep ( typeexpr , ">" ) , poplex , afterType ) ;
}
function typeparam ( ) {
return pass ( typeexpr , maybeTypeDefault ) ;
}
function maybeTypeDefault ( _ , value ) {
if ( value == "=" )
return cont ( typeexpr ) ;
}
function vardef ( _ , value ) {
if ( value == "enum" ) {
cx . marked = "keyword" ;
return cont ( enumdef ) ;
}
return pass ( pattern , maybetype , maybeAssign , vardefCont ) ;
}
function pattern ( type2 , value ) {
if ( isTS && isModifier ( value ) ) {
cx . marked = "keyword" ;
return cont ( pattern ) ;
}
if ( type2 == "variable" ) {
register ( value ) ;
return cont ( ) ;
}
if ( type2 == "spread" )
return cont ( pattern ) ;
if ( type2 == "[" )
return contCommasep ( eltpattern , "]" ) ;
if ( type2 == "{" )
return contCommasep ( proppattern , "}" ) ;
}
function proppattern ( type2 , value ) {
if ( type2 == "variable" && ! cx . stream . match ( /^\s*:/ , false ) ) {
register ( value ) ;
return cont ( maybeAssign ) ;
}
if ( type2 == "variable" )
cx . marked = "property" ;
if ( type2 == "spread" )
return cont ( pattern ) ;
if ( type2 == "}" )
return pass ( ) ;
if ( type2 == "[" )
return cont ( expression , expect ( "]" ) , expect ( ":" ) , proppattern ) ;
return cont ( expect ( ":" ) , pattern , maybeAssign ) ;
}
function eltpattern ( ) {
return pass ( pattern , maybeAssign ) ;
}
function maybeAssign ( _type , value ) {
if ( value == "=" )
return cont ( expressionNoComma ) ;
}
function vardefCont ( type2 ) {
if ( type2 == "," )
return cont ( vardef ) ;
}
function maybeelse ( type2 , value ) {
if ( type2 == "keyword b" && value == "else" )
return cont ( pushlex ( "form" , "else" ) , statement , poplex ) ;
}
function forspec ( type2 , value ) {
if ( value == "await" )
return cont ( forspec ) ;
if ( type2 == "(" )
return cont ( pushlex ( ")" ) , forspec1 , poplex ) ;
}
function forspec1 ( type2 ) {
if ( type2 == "var" )
return cont ( vardef , forspec2 ) ;
if ( type2 == "variable" )
return cont ( forspec2 ) ;
return pass ( forspec2 ) ;
}
function forspec2 ( type2 , value ) {
if ( type2 == ")" )
return cont ( ) ;
if ( type2 == ";" )
return cont ( forspec2 ) ;
if ( value == "in" || value == "of" ) {
cx . marked = "keyword" ;
return cont ( expression , forspec2 ) ;
}
return pass ( expression , forspec2 ) ;
}
function functiondef ( type2 , value ) {
if ( value == "*" ) {
cx . marked = "keyword" ;
return cont ( functiondef ) ;
}
if ( type2 == "variable" ) {
register ( value ) ;
return cont ( functiondef ) ;
}
if ( type2 == "(" )
return cont ( pushcontext , pushlex ( ")" ) , commasep ( funarg , ")" ) , poplex , mayberettype , statement , popcontext ) ;
if ( isTS && value == "<" )
return cont ( pushlex ( ">" ) , commasep ( typeparam , ">" ) , poplex , functiondef ) ;
}
function functiondecl ( type2 , value ) {
if ( value == "*" ) {
cx . marked = "keyword" ;
return cont ( functiondecl ) ;
}
if ( type2 == "variable" ) {
register ( value ) ;
return cont ( functiondecl ) ;
}
if ( type2 == "(" )
return cont ( pushcontext , pushlex ( ")" ) , commasep ( funarg , ")" ) , poplex , mayberettype , popcontext ) ;
if ( isTS && value == "<" )
return cont ( pushlex ( ">" ) , commasep ( typeparam , ">" ) , poplex , functiondecl ) ;
}
function typename ( type2 , value ) {
if ( type2 == "keyword" || type2 == "variable" ) {
cx . marked = "type" ;
return cont ( typename ) ;
} else if ( value == "<" ) {
return cont ( pushlex ( ">" ) , commasep ( typeparam , ">" ) , poplex ) ;
}
}
function funarg ( type2 , value ) {
if ( value == "@" )
cont ( expression , funarg ) ;
if ( type2 == "spread" )
return cont ( funarg ) ;
if ( isTS && isModifier ( value ) ) {
cx . marked = "keyword" ;
return cont ( funarg ) ;
}
if ( isTS && type2 == "this" )
return cont ( maybetype , maybeAssign ) ;
return pass ( pattern , maybetype , maybeAssign ) ;
}
function classExpression ( type2 , value ) {
if ( type2 == "variable" )
return className ( type2 , value ) ;
return classNameAfter ( type2 , value ) ;
}
function className ( type2 , value ) {
if ( type2 == "variable" ) {
register ( value ) ;
return cont ( classNameAfter ) ;
}
}
function classNameAfter ( type2 , value ) {
if ( value == "<" )
return cont ( pushlex ( ">" ) , commasep ( typeparam , ">" ) , poplex , classNameAfter ) ;
if ( value == "extends" || value == "implements" || isTS && type2 == "," ) {
if ( value == "implements" )
cx . marked = "keyword" ;
return cont ( isTS ? typeexpr : expression , classNameAfter ) ;
}
if ( type2 == "{" )
return cont ( pushlex ( "}" ) , classBody , poplex ) ;
}
function classBody ( type2 , value ) {
if ( type2 == "async" || type2 == "variable" && ( value == "static" || value == "get" || value == "set" || isTS && isModifier ( value ) ) && cx . stream . match ( /^\s+[\w$\xa1-\uffff]/ , false ) ) {
cx . marked = "keyword" ;
return cont ( classBody ) ;
}
if ( type2 == "variable" || cx . style == "keyword" ) {
cx . marked = "property" ;
return cont ( classfield , classBody ) ;
}
if ( type2 == "number" || type2 == "string" )
return cont ( classfield , classBody ) ;
if ( type2 == "[" )
return cont ( expression , maybetype , expect ( "]" ) , classfield , classBody ) ;
if ( value == "*" ) {
cx . marked = "keyword" ;
return cont ( classBody ) ;
}
if ( isTS && type2 == "(" )
return pass ( functiondecl , classBody ) ;
if ( type2 == ";" || type2 == "," )
return cont ( classBody ) ;
if ( type2 == "}" )
return cont ( ) ;
if ( value == "@" )
return cont ( expression , classBody ) ;
}
function classfield ( type2 , value ) {
if ( value == "!" )
return cont ( classfield ) ;
if ( value == "?" )
return cont ( classfield ) ;
if ( type2 == ":" )
return cont ( typeexpr , maybeAssign ) ;
if ( value == "=" )
return cont ( expressionNoComma ) ;
var context = cx . state . lexical . prev , isInterface = context && context . info == "interface" ;
return pass ( isInterface ? functiondecl : functiondef ) ;
}
function afterExport ( type2 , value ) {
if ( value == "*" ) {
cx . marked = "keyword" ;
return cont ( maybeFrom , expect ( ";" ) ) ;
}
if ( value == "default" ) {
cx . marked = "keyword" ;
return cont ( expression , expect ( ";" ) ) ;
}
if ( type2 == "{" )
return cont ( commasep ( exportField , "}" ) , maybeFrom , expect ( ";" ) ) ;
return pass ( statement ) ;
}
function exportField ( type2 , value ) {
if ( value == "as" ) {
cx . marked = "keyword" ;
return cont ( expect ( "variable" ) ) ;
}
if ( type2 == "variable" )
return pass ( expressionNoComma , exportField ) ;
}
function afterImport ( type2 ) {
if ( type2 == "string" )
return cont ( ) ;
if ( type2 == "(" )
return pass ( expression ) ;
if ( type2 == "." )
return pass ( maybeoperatorComma ) ;
return pass ( importSpec , maybeMoreImports , maybeFrom ) ;
}
function importSpec ( type2 , value ) {
if ( type2 == "{" )
return contCommasep ( importSpec , "}" ) ;
if ( type2 == "variable" )
register ( value ) ;
if ( value == "*" )
cx . marked = "keyword" ;
return cont ( maybeAs ) ;
}
function maybeMoreImports ( type2 ) {
if ( type2 == "," )
return cont ( importSpec , maybeMoreImports ) ;
}
function maybeAs ( _type , value ) {
if ( value == "as" ) {
cx . marked = "keyword" ;
return cont ( importSpec ) ;
}
}
function maybeFrom ( _type , value ) {
if ( value == "from" ) {
cx . marked = "keyword" ;
return cont ( expression ) ;
}
}
function arrayLiteral ( type2 ) {
if ( type2 == "]" )
return cont ( ) ;
return pass ( commasep ( expressionNoComma , "]" ) ) ;
}
function enumdef ( ) {
return pass ( pushlex ( "form" ) , pattern , expect ( "{" ) , pushlex ( "}" ) , commasep ( enummember , "}" ) , poplex , poplex ) ;
}
function enummember ( ) {
return pass ( pattern , maybeAssign ) ;
}
function isContinuedStatement ( state , textAfter ) {
return state . lastType == "operator" || state . lastType == "," || isOperatorChar . test ( textAfter . charAt ( 0 ) ) || /[,.]/ . test ( textAfter . charAt ( 0 ) ) ;
}
function expressionAllowed ( stream , state , backUp ) {
return state . tokenize == tokenBase && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/ . test ( state . lastType ) || state . lastType == "quasi" && /\{\s*$/ . test ( stream . string . slice ( 0 , stream . pos - ( backUp || 0 ) ) ) ;
}
return {
startState : function ( basecolumn ) {
var state = {
tokenize : tokenBase ,
lastType : "sof" ,
cc : [ ] ,
lexical : new JSLexical ( ( basecolumn || 0 ) - indentUnit , 0 , "block" , false ) ,
localVars : parserConfig . localVars ,
context : parserConfig . localVars && new Context ( null , null , false ) ,
indented : basecolumn || 0
} ;
if ( parserConfig . globalVars && typeof parserConfig . globalVars == "object" )
state . globalVars = parserConfig . globalVars ;
return state ;
} ,
token : function ( stream , state ) {
if ( stream . sol ( ) ) {
if ( ! state . lexical . hasOwnProperty ( "align" ) )
state . lexical . align = false ;
state . indented = stream . indentation ( ) ;
findFatArrow ( stream , state ) ;
}
if ( state . tokenize != tokenComment && stream . eatSpace ( ) )
return null ;
var style = state . tokenize ( stream , state ) ;
if ( type == "comment" )
return style ;
state . lastType = type == "operator" && ( content == "++" || content == "--" ) ? "incdec" : type ;
return parseJS ( state , style , type , content , stream ) ;
} ,
indent : function ( state , textAfter ) {
if ( state . tokenize == tokenComment || state . tokenize == tokenQuasi )
return CodeMirror . Pass ;
if ( state . tokenize != tokenBase )
return 0 ;
var firstChar = textAfter && textAfter . charAt ( 0 ) , lexical = state . lexical , top2 ;
if ( ! /^\s*else\b/ . test ( textAfter ) )
for ( var i = state . cc . length - 1 ; i >= 0 ; -- i ) {
var c = state . cc [ i ] ;
if ( c == poplex )
lexical = lexical . prev ;
else if ( c != maybeelse && c != popcontext )
break ;
}
while ( ( lexical . type == "stat" || lexical . type == "form" ) && ( firstChar == "}" || ( top2 = state . cc [ state . cc . length - 1 ] ) && ( top2 == maybeoperatorComma || top2 == maybeoperatorNoComma ) && ! /^[,\.=+\-*:?[\(]/ . test ( textAfter ) ) )
lexical = lexical . prev ;
if ( statementIndent && lexical . type == ")" && lexical . prev . type == "stat" )
lexical = lexical . prev ;
var type2 = lexical . type , closing = firstChar == type2 ;
if ( type2 == "vardef" )
return lexical . indented + ( state . lastType == "operator" || state . lastType == "," ? lexical . info . length + 1 : 0 ) ;
else if ( type2 == "form" && firstChar == "{" )
return lexical . indented ;
else if ( type2 == "form" )
return lexical . indented + indentUnit ;
else if ( type2 == "stat" )
return lexical . indented + ( isContinuedStatement ( state , textAfter ) ? statementIndent || indentUnit : 0 ) ;
else if ( lexical . info == "switch" && ! closing && parserConfig . doubleIndentSwitch != false )
return lexical . indented + ( /^(?:case|default)\b/ . test ( textAfter ) ? indentUnit : 2 * indentUnit ) ;
else if ( lexical . align )
return lexical . column + ( closing ? 0 : 1 ) ;
else
return lexical . indented + ( closing ? 0 : indentUnit ) ;
} ,
electricInput : /^\s*(?:case .*?:|default:|\{|\})$/ ,
blockCommentStart : jsonMode ? null : "/*" ,
blockCommentEnd : jsonMode ? null : "*/" ,
blockCommentContinue : jsonMode ? null : " * " ,
lineComment : jsonMode ? null : "//" ,
fold : "brace" ,
closeBrackets : "()[]{}''\"\"``" ,
helperType : jsonMode ? "json" : "javascript" ,
jsonldMode ,
jsonMode ,
expressionAllowed ,
skipExpression : function ( state ) {
parseJS ( state , "atom" , "atom" , "true" , new CodeMirror . StringStream ( "" , 2 , null ) ) ;
}
} ;
} ) ;
CodeMirror . registerHelper ( "wordChars" , "javascript" , /[\w$]/ ) ;
CodeMirror . defineMIME ( "text/javascript" , "javascript" ) ;
CodeMirror . defineMIME ( "text/ecmascript" , "javascript" ) ;
CodeMirror . defineMIME ( "application/javascript" , "javascript" ) ;
CodeMirror . defineMIME ( "application/x-javascript" , "javascript" ) ;
CodeMirror . defineMIME ( "application/ecmascript" , "javascript" ) ;
CodeMirror . defineMIME ( "application/json" , {
name : "javascript" ,
json : true
} ) ;
CodeMirror . defineMIME ( "application/x-json" , {
name : "javascript" ,
json : true
} ) ;
CodeMirror . defineMIME ( "application/manifest+json" , {
name : "javascript" ,
json : true
} ) ;
CodeMirror . defineMIME ( "application/ld+json" , {
name : "javascript" ,
jsonld : true
} ) ;
CodeMirror . defineMIME ( "text/typescript" , {
name : "javascript" ,
typescript : true
} ) ;
CodeMirror . defineMIME ( "application/typescript" , {
name : "javascript" ,
typescript : true
} ) ;
} ) ;
// src/editor/mode/custom_overlay.js
( function ( mod ) {
mod ( window . CodeMirror ) ;
} ) ( function ( CodeMirror ) {
"use strict" ;
CodeMirror . customOverlayMode = function ( base , overlay , combine ) {
return {
startState : function ( ) {
return {
base : CodeMirror . startState ( base ) ,
overlay : CodeMirror . startState ( overlay ) ,
basePos : 0 ,
baseCur : null ,
overlayPos : 0 ,
overlayCur : null ,
streamSeen : null
} ;
} ,
copyState : function ( state ) {
return {
base : CodeMirror . copyState ( base , state . base ) ,
overlay : CodeMirror . copyState ( overlay , state . overlay ) ,
basePos : state . basePos ,
baseCur : null ,
overlayPos : state . overlayPos ,
overlayCur : null
} ;
} ,
token : function ( stream , state ) {
if ( stream != state . streamSeen || Math . min ( state . basePos , state . overlayPos ) < stream . start ) {
state . streamSeen = stream ;
state . basePos = state . overlayPos = stream . start ;
}
if ( stream . start == state . basePos ) {
state . baseCur = base . token ( stream , state . base ) ;
state . basePos = stream . pos ;
}
if ( stream . start == state . overlayPos ) {
stream . pos = stream . start ;
state . overlayCur = overlay . token ( stream , state . overlay ) ;
state . overlayPos = stream . pos ;
}
stream . pos = Math . min ( state . basePos , state . overlayPos ) ;
if ( state . baseCur && state . overlayCur && state . baseCur . contains ( "line-HyperMD-codeblock" ) ) {
state . overlayCur = state . overlayCur . replace ( "line-templater-inline" , "" ) ;
state . overlayCur += ` line-background-HyperMD-codeblock-bg ` ;
}
if ( state . overlayCur == null )
return state . baseCur ;
else if ( state . baseCur != null && state . overlay . combineTokens || combine && state . overlay . combineTokens == null )
return state . baseCur + " " + state . overlayCur ;
else
return state . overlayCur ;
} ,
indent : base . indent && function ( state , textAfter , line ) {
return base . indent ( state . base , textAfter , line ) ;
} ,
electricChars : base . electricChars ,
innerMode : function ( state ) {
return { state : state . base , mode : base } ;
} ,
blankLine : function ( state ) {
var baseToken , overlayToken ;
if ( base . blankLine )
baseToken = base . blankLine ( state . base ) ;
if ( overlay . blankLine )
overlayToken = overlay . blankLine ( state . overlay ) ;
return overlayToken == null ? baseToken : combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken ;
}
} ;
} ;
} ) ;
// src/editor/Editor.ts
2023-09-05 17:29:16 +08:00
var import _language = _ _toModule ( require ( "@codemirror/language" ) ) ;
2022-08-24 16:29:06 +08:00
var TP _CMD _TOKEN _CLASS = "templater-command" ;
var TP _INLINE _CLASS = "templater-inline" ;
var TP _OPENING _TAG _TOKEN _CLASS = "templater-opening-tag" ;
var TP _CLOSING _TAG _TOKEN _CLASS = "templater-closing-tag" ;
var TP _INTERPOLATION _TAG _TOKEN _CLASS = "templater-interpolation-tag" ;
var TP _EXEC _TAG _TOKEN _CLASS = "templater-execution-tag" ;
var Editor2 = class {
2023-09-05 17:29:16 +08:00
constructor ( plugin ) {
2022-08-24 16:29:06 +08:00
this . plugin = plugin ;
2023-09-05 17:29:16 +08:00
this . cursor _jumper = new CursorJumper ( ) ;
2022-08-24 16:29:06 +08:00
}
2023-10-17 15:38:39 +08:00
desktopShouldHighlight ( ) {
return import _obsidian16 . Platform . isDesktopApp && this . plugin . settings . syntax _highlighting ;
}
mobileShouldHighlight ( ) {
return import _obsidian16 . Platform . isMobileApp && this . plugin . settings . syntax _highlighting _mobile ;
}
2023-09-05 17:29:16 +08:00
async setup ( ) {
await this . registerCodeMirrorMode ( ) ;
2023-10-17 15:38:39 +08:00
this . plugin . registerEditorSuggest ( new Autocomplete ( this . plugin . settings ) ) ;
if ( this . desktopShouldHighlight ( ) || this . mobileShouldHighlight ( ) ) {
2023-09-05 17:29:16 +08:00
this . plugin . registerEditorExtension ( import _language . StreamLanguage . define ( window . CodeMirror . getMode ( { } , { name : "templater" } ) ) ) ;
}
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async jump _to _next _cursor _location ( file = null , auto _jump = false ) {
if ( auto _jump && ! this . plugin . settings . auto _jump _to _cursor ) {
return ;
}
2023-10-17 15:38:39 +08:00
if ( file && get _active _file ( app ) !== file ) {
2023-09-05 17:29:16 +08:00
return ;
}
await this . cursor _jumper . jump _to _next _cursor _location ( ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async registerCodeMirrorMode ( ) {
2023-10-17 15:38:39 +08:00
if ( ! this . desktopShouldHighlight ( ) && ! this . mobileShouldHighlight ( ) ) {
2023-09-05 17:29:16 +08:00
return ;
}
const js _mode = window . CodeMirror . getMode ( { } , "javascript" ) ;
if ( js _mode . name === "null" ) {
log _error ( new TemplaterError ( "Javascript syntax mode couldn't be found, can't enable syntax highlighting." ) ) ;
return ;
}
const overlay _mode = window . CodeMirror . customOverlayMode ;
if ( overlay _mode == null ) {
log _error ( new TemplaterError ( "Couldn't find customOverlayMode, can't enable syntax highlighting." ) ) ;
return ;
}
window . CodeMirror . defineMode ( "templater" , function ( config ) {
const templaterOverlay = {
startState : function ( ) {
const js _state = window . CodeMirror . startState ( js _mode ) ;
return {
... js _state ,
inCommand : false ,
tag _class : "" ,
freeLine : false
} ;
} ,
copyState : function ( state ) {
const js _state = window . CodeMirror . startState ( js _mode ) ;
const new _state = {
... js _state ,
inCommand : state . inCommand ,
tag _class : state . tag _class ,
freeLine : state . freeLine
} ;
return new _state ;
} ,
blankLine : function ( state ) {
if ( state . inCommand ) {
return ` line-background-templater-command-bg ` ;
}
return null ;
} ,
token : function ( stream , state ) {
if ( stream . sol ( ) && state . inCommand ) {
state . freeLine = true ;
}
if ( state . inCommand ) {
let keywords = "" ;
if ( stream . match ( /[-_]{0,1}%>/ , true ) ) {
state . inCommand = false ;
state . freeLine = false ;
const tag _class = state . tag _class ;
state . tag _class = "" ;
return ` line- ${ TP _INLINE _CLASS } ${ TP _CMD _TOKEN _CLASS } ${ TP _CLOSING _TAG _TOKEN _CLASS } ${ tag _class } ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
const js _result = js _mode . token && js _mode . token ( stream , state ) ;
if ( stream . peek ( ) == null && state . freeLine ) {
keywords += ` line-background-templater-command-bg ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
if ( ! state . freeLine ) {
keywords += ` line- ${ TP _INLINE _CLASS } ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
return ` ${ keywords } ${ TP _CMD _TOKEN _CLASS } ${ js _result } ` ;
}
const match = stream . match ( /<%[-_]{0,1}\s*([*+]{0,1})/ , true ) ;
if ( match != null ) {
switch ( match [ 1 ] ) {
case "*" :
state . tag _class = TP _EXEC _TAG _TOKEN _CLASS ;
break ;
default :
state . tag _class = TP _INTERPOLATION _TAG _TOKEN _CLASS ;
break ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
state . inCommand = true ;
return ` line- ${ TP _INLINE _CLASS } ${ TP _CMD _TOKEN _CLASS } ${ TP _OPENING _TAG _TOKEN _CLASS } ${ state . tag _class } ` ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
while ( stream . next ( ) != null && ! stream . match ( /<%/ , false ) )
;
return null ;
}
} ;
return overlay _mode ( window . CodeMirror . getMode ( config , "hypermd" ) , templaterOverlay ) ;
2022-08-24 16:29:06 +08:00
} ) ;
}
} ;
// src/main.ts
2023-10-17 15:38:39 +08:00
var TemplaterPlugin = class extends import _obsidian17 . Plugin {
2023-09-05 17:29:16 +08:00
async onload ( ) {
await this . load _settings ( ) ;
this . templater = new Templater ( this ) ;
await this . templater . setup ( ) ;
this . editor _handler = new Editor2 ( this ) ;
await this . editor _handler . setup ( ) ;
this . fuzzy _suggester = new FuzzySuggester ( this ) ;
this . event _handler = new EventHandler ( this , this . templater , this . settings ) ;
this . event _handler . setup ( ) ;
this . command _handler = new CommandHandler ( this ) ;
this . command _handler . setup ( ) ;
2023-10-17 15:38:39 +08:00
( 0 , import _obsidian17 . addIcon ) ( "templater-icon" , ICON _DATA ) ;
2023-09-05 17:29:16 +08:00
if ( this . settings . enable _ribbon _icon ) {
this . addRibbonIcon ( "templater-icon" , "Templater" , async ( ) => {
2022-08-24 16:29:06 +08:00
this . fuzzy _suggester . insert _template ( ) ;
2023-09-05 17:29:16 +08:00
} ) . setAttribute ( "id" , "rb-templater-icon" ) ;
}
this . addSettingTab ( new TemplaterSettingTab ( this ) ) ;
app . workspace . onLayoutReady ( ( ) => {
this . templater . execute _startup _scripts ( ) ;
2022-08-24 16:29:06 +08:00
} ) ;
}
2023-09-05 17:29:16 +08:00
async save _settings ( ) {
await this . saveData ( this . settings ) ;
2022-08-24 16:29:06 +08:00
}
2023-09-05 17:29:16 +08:00
async load _settings ( ) {
this . settings = Object . assign ( { } , DEFAULT _SETTINGS , await this . loadData ( ) ) ;
2022-08-24 16:29:06 +08:00
}
} ;