From a2a3d1b86f506cd09076436b0c899fba7d6a77ce Mon Sep 17 00:00:00 2001 From: sajjad isvand Date: Thu, 28 Dec 2023 20:52:47 +0330 Subject: [PATCH] Updates --- IdPayDriver.html | 3 + PaymentResponseIdPay.html | 3 + TransactionCreateInputIdPay.html | 3 + TransactionCreateInputZp.html | 3 + TransactionCreateResponseIdPay.html | 3 + TransactionCreateResponseZp.html | 3 + TransactionErrorZp.html | 3 + TransactionVerifyInputIdPay.html | 296 + TransactionVerifyInputZp.html | 296 + TransactionVerifyResponseIdPay.html | 534 ++ TransactionVerifyResponseZp.html | 3 + ZarinPalDriver.html | 3 + data/search.json | 1 + fonts/Inconsolata-Regular.ttf | Bin 0 -> 97864 bytes fonts/OpenSans-Regular.ttf | Bin 0 -> 129796 bytes fonts/WorkSans-Bold.ttf | Bin 0 -> 192548 bytes global.html | 3 + idpay_enums_urls.enum.ts.html | 24 + idpay_idpay.ts.html | 128 + idpay_interfaces_request.interface.ts.html | 98 + idpay_interfaces_response.interface.ts.html | 119 + index.html | 3 + scripts/app.min.js | 1 + scripts/core.js | 702 +++ scripts/core.min.js | 23 + scripts/linenumber.js | 26 + scripts/resize.js | 90 + scripts/search.js | 265 + scripts/search.min.js | 6 + scripts/third-party/Apache-License-2.0.txt | 202 + scripts/third-party/fuse.js | 9 + scripts/third-party/hljs-line-num-original.js | 369 ++ scripts/third-party/hljs-line-num.js | 1 + scripts/third-party/hljs-original.js | 5171 +++++++++++++++++ scripts/third-party/hljs.js | 1 + scripts/third-party/popper.js | 5 + scripts/third-party/tippy.js | 1 + scripts/third-party/tocbot.js | 672 +++ scripts/third-party/tocbot.min.js | 1 + styles/app.min.css | 1 + styles/clean-jsdoc-theme-base.css | 975 ++++ styles/clean-jsdoc-theme-dark.css | 407 ++ styles/clean-jsdoc-theme-light.css | 388 ++ styles/clean-jsdoc-theme.min.css | 1 + styles/iframe.css | 13 + styles/prettify-jsdoc.css | 111 + styles/prettify-tomorrow.css | 132 + styles/reset.css | 44 + zarinpal_enums_errors.enum.ts.html | 36 + zarinpal_enums_urls.enum.ts.html | 57 + ...npal_interfaces_requests.interface.ts.html | 186 + zarinpal_zarinpal.ts.html | 144 + 52 files changed, 11569 insertions(+) create mode 100644 IdPayDriver.html create mode 100644 PaymentResponseIdPay.html create mode 100644 TransactionCreateInputIdPay.html create mode 100644 TransactionCreateInputZp.html create mode 100644 TransactionCreateResponseIdPay.html create mode 100644 TransactionCreateResponseZp.html create mode 100644 TransactionErrorZp.html create mode 100644 TransactionVerifyInputIdPay.html create mode 100644 TransactionVerifyInputZp.html create mode 100644 TransactionVerifyResponseIdPay.html create mode 100644 TransactionVerifyResponseZp.html create mode 100644 ZarinPalDriver.html create mode 100644 data/search.json create mode 100644 fonts/Inconsolata-Regular.ttf create mode 100644 fonts/OpenSans-Regular.ttf create mode 100644 fonts/WorkSans-Bold.ttf create mode 100644 global.html create mode 100644 idpay_enums_urls.enum.ts.html create mode 100644 idpay_idpay.ts.html create mode 100644 idpay_interfaces_request.interface.ts.html create mode 100644 idpay_interfaces_response.interface.ts.html create mode 100644 index.html create mode 100644 scripts/app.min.js create mode 100644 scripts/core.js create mode 100644 scripts/core.min.js create mode 100644 scripts/linenumber.js create mode 100644 scripts/resize.js create mode 100644 scripts/search.js create mode 100644 scripts/search.min.js create mode 100644 scripts/third-party/Apache-License-2.0.txt create mode 100644 scripts/third-party/fuse.js create mode 100644 scripts/third-party/hljs-line-num-original.js create mode 100644 scripts/third-party/hljs-line-num.js create mode 100644 scripts/third-party/hljs-original.js create mode 100644 scripts/third-party/hljs.js create mode 100644 scripts/third-party/popper.js create mode 100644 scripts/third-party/tippy.js create mode 100644 scripts/third-party/tocbot.js create mode 100644 scripts/third-party/tocbot.min.js create mode 100644 styles/app.min.css create mode 100644 styles/clean-jsdoc-theme-base.css create mode 100644 styles/clean-jsdoc-theme-dark.css create mode 100644 styles/clean-jsdoc-theme-light.css create mode 100644 styles/clean-jsdoc-theme.min.css create mode 100644 styles/iframe.css create mode 100644 styles/prettify-jsdoc.css create mode 100644 styles/prettify-tomorrow.css create mode 100644 styles/reset.css create mode 100644 zarinpal_enums_errors.enum.ts.html create mode 100644 zarinpal_enums_urls.enum.ts.html create mode 100644 zarinpal_interfaces_requests.interface.ts.html create mode 100644 zarinpal_zarinpal.ts.html diff --git a/IdPayDriver.html b/IdPayDriver.html new file mode 100644 index 0000000..ea2ea82 --- /dev/null +++ b/IdPayDriver.html @@ -0,0 +1,3 @@ +Class: IdPayDriver
On this page

IdPayDriver

new IdPayDriver()

Class that provides methods to interact with the IdPay API.

Methods

(async) request(dataInput) → {Promise.<TransactionCreateResponseIdPay>}

Request method to create a transaction.
Parameters:
NameTypeDescription
dataInputTransactionCreateInputIdPayInput data for creating the transaction.
Returns:
Response from the IdPay API for creating a transaction.
Type: 
Promise.<TransactionCreateResponseIdPay>

(async) request(dataInput) → {Promise.<TransactionCreateResponseIdPay>}

Request method to create a transaction.
Parameters:
NameTypeDescription
dataInputTransactionCreateInputIdPayInput data for creating the transaction.
Returns:
Response from the IdPay API for creating a transaction.
Type: 
Promise.<TransactionCreateResponseIdPay>

setSandBox(sandBox) → {this}

Set whether to use the sandbox environment or not.
Parameters:
NameTypeDescription
sandBoxbooleanTrue to use sandbox, false otherwise.
Returns:
Instance of IdPayDriver.
Type: 
this

setSandBox(sandBox) → {this}

Set whether to use the sandbox environment or not.
Parameters:
NameTypeDescription
sandBoxbooleanTrue to use sandbox, false otherwise.
Returns:
Instance of IdPayDriver.
Type: 
this

setToken(token) → {this}

Set the API token for authentication.
Parameters:
NameTypeDescription
tokenstringThe API token.
Returns:
Instance of IdPayDriver.
Type: 
this

setToken(token) → {this}

Set the API token for authentication.
Parameters:
NameTypeDescription
tokenstringThe API token.
Returns:
Instance of IdPayDriver.
Type: 
this

(async) verify(dataInput) → {Promise.<TransactionVerifyResponseIdPay>}

Verify method to verify a transaction.
Parameters:
NameTypeDescription
dataInputTransactionVerifyInputIdPayInput data for verifying the transaction.
Returns:
Response from the IdPay API for verifying a transaction.
Type: 
Promise.<TransactionVerifyResponseIdPay>

(async) verify(dataInput) → {Promise.<TransactionVerifyResponseIdPay>}

Verify method to verify a transaction.
Parameters:
NameTypeDescription
dataInputTransactionVerifyInputIdPayInput data for verifying the transaction.
Returns:
Response from the IdPay API for verifying a transaction.
Type: 
Promise.<TransactionVerifyResponseIdPay>
\ No newline at end of file diff --git a/PaymentResponseIdPay.html b/PaymentResponseIdPay.html new file mode 100644 index 0000000..c5bb072 --- /dev/null +++ b/PaymentResponseIdPay.html @@ -0,0 +1,3 @@ +Interface: PaymentResponseIdPay
On this page

PaymentResponseIdPay

Represents the payment details in the response for IdPay.

Members

amount :string

Amount associated with the payment.
Type:
  • string

card_no :string

Card number used for the payment.
Type:
  • string

date :string

Date of the payment.
Type:
  • string

hashed_card_no :string

Hashed card number for security reasons.
Type:
  • string

track_id :string

Tracking ID for the payment.
Type:
  • string
\ No newline at end of file diff --git a/TransactionCreateInputIdPay.html b/TransactionCreateInputIdPay.html new file mode 100644 index 0000000..15d8ded --- /dev/null +++ b/TransactionCreateInputIdPay.html @@ -0,0 +1,3 @@ +Interface: TransactionCreateInputIdPay
On this page

TransactionCreateInputIdPay

Represents the input structure for creating a transaction with IdPay.

Members

amount :number

Desired amount in Rials. Amount must be between 1,000 Rials to 500,000,000 Rials.
Type:
  • number

callback :string

Merchant's callback URL. Maximum length: 2048 characters.
Type:
  • string

desc :string

Transaction description. Maximum length: 255 characters.
Type:
  • string

mail :string

Email address of the payer. Maximum length: 255 characters.
Type:
  • string

name :string

Name of the payer. Maximum length: 255 characters.
Type:
  • string

order_id :string

Merchant order ID. Maximum length: 50 characters.
Type:
  • string

phone :string

Mobile number of the payer. Length should be 11 characters. Examples: 9382198592, 09382198592, 989382198592.
Type:
  • string

token :string

The token for authentication, if available.
Type:
  • string
\ No newline at end of file diff --git a/TransactionCreateInputZp.html b/TransactionCreateInputZp.html new file mode 100644 index 0000000..ae3bb3e --- /dev/null +++ b/TransactionCreateInputZp.html @@ -0,0 +1,3 @@ +Interface: TransactionCreateInputZp
On this page

TransactionCreateInputZp

Represents the input structure for creating a transaction with ZarinPal.

Members

amount :number

Amount for the transaction.
Type:
  • number

callback_url :string

Callback URL to redirect after the transaction.
Type:
  • string

currency :"IRR"|"IRT"

Currency type for the transaction, either "IRR" or "IRT".
Type:
  • "IRR" | "IRT"

description :string

Description for the transaction.
Type:
  • string

merchant_id :string

Merchant ID, if available.
Type:
  • string

metadata :object

Additional metadata for the transaction.
Type:
  • object
Properties
NameTypeAttributesDescription
mobilestring<optional>
emailstring<optional>
order_idstring<optional>
\ No newline at end of file diff --git a/TransactionCreateResponseIdPay.html b/TransactionCreateResponseIdPay.html new file mode 100644 index 0000000..6e199aa --- /dev/null +++ b/TransactionCreateResponseIdPay.html @@ -0,0 +1,3 @@ +Interface: TransactionCreateResponseIdPay
On this page

TransactionCreateResponseIdPay

Represents the response structure for creating a transaction with IdPay.

Members

data :object

Data related to the transaction if successful.
Type:
  • object
Properties
NameTypeDescription
idstring
linkstring

error_code :string|null

Error code if an error occurred, otherwise null.
Type:
  • string | null

error_message :string|null

Error message if an error occurred, otherwise null.
Type:
  • string | null

isError :boolean

Indicates if there's an error in the response.
Type:
  • boolean
\ No newline at end of file diff --git a/TransactionCreateResponseZp.html b/TransactionCreateResponseZp.html new file mode 100644 index 0000000..546cc77 --- /dev/null +++ b/TransactionCreateResponseZp.html @@ -0,0 +1,3 @@ +Interface: TransactionCreateResponseZp
On this page

TransactionCreateResponseZp

Represents the response structure for creating a transaction with ZarinPal.

Members

data :object

Data related to the transaction if successful.
Type:
  • object
Properties
NameTypeDescription
codenumber
messagestring
authoritystring
fee_typestring
feenumber
urlstring

error :TransactionErrorZp

Error details if an error occurred.

isError :boolean

Indicates if there's an error in the response.
Type:
  • boolean
\ No newline at end of file diff --git a/TransactionErrorZp.html b/TransactionErrorZp.html new file mode 100644 index 0000000..a68dd72 --- /dev/null +++ b/TransactionErrorZp.html @@ -0,0 +1,3 @@ +Interface: TransactionErrorZp
On this page

TransactionErrorZp

\ No newline at end of file diff --git a/TransactionVerifyInputIdPay.html b/TransactionVerifyInputIdPay.html new file mode 100644 index 0000000..6a09141 --- /dev/null +++ b/TransactionVerifyInputIdPay.html @@ -0,0 +1,296 @@ + + + + + + + + TransactionVerifyInputIdPay + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+

Interface

+

TransactionVerifyInputIdPay

+
+ + + + + +
+ +
+ +

TransactionVerifyInputIdPay

+ + +
+ +
+
+ + +
Represents the input structure for verifying a transaction with IdPay. Inherits properties 'order_id' and 'token' from TransactionCreateInputIdPay.
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + idpay/interfaces/request.interface.ts, line 86 + +

+ +
+ + + + +
+ + +

Extends

+ + + + +
    +
  • Pick +
+ + + + + + + + + + + + + + + +
+

Members

+
+ +
+ + + + +string + + + + +

+ # + + + id + + +

+ + + + +
+ Transaction ID. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + idpay/interfaces/request.interface.ts, line 94 + +

+ +
+ + + + + +
+ +
+
+ + + + + + + +
+ +
+ + + + +
+ + + +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/TransactionVerifyInputZp.html b/TransactionVerifyInputZp.html new file mode 100644 index 0000000..dee630f --- /dev/null +++ b/TransactionVerifyInputZp.html @@ -0,0 +1,296 @@ + + + + + + + + TransactionVerifyInputZp + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+

Interface

+

TransactionVerifyInputZp

+
+ + + + + +
+ +
+ +

TransactionVerifyInputZp

+ + +
+ +
+
+ + +
Represents the input structure for verifying a transaction with ZarinPal. Inherits properties 'merchant_id' and 'amount' from TransactionCreateInputZp.
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + zarinpal/interfaces/requests.interface.ts, line 64 + +

+ +
+ + + + +
+ + +

Extends

+ + + + +
    +
  • Pick +
+ + + + + + + + + + + + + + + +
+

Members

+
+ +
+ + + + +string + + + + +

+ # + + + authority + + +

+ + + + +
+ Transaction authority. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + zarinpal/interfaces/requests.interface.ts, line 72 + +

+ +
+ + + + + +
+ +
+
+ + + + + + + +
+ +
+ + + + +
+ + + +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/TransactionVerifyResponseIdPay.html b/TransactionVerifyResponseIdPay.html new file mode 100644 index 0000000..f5f929f --- /dev/null +++ b/TransactionVerifyResponseIdPay.html @@ -0,0 +1,534 @@ + + + + + + + + TransactionVerifyResponseIdPay + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+

Interface

+

TransactionVerifyResponseIdPay

+
+ + + + + +
+ +
+ +

TransactionVerifyResponseIdPay

+ + +
+ +
+
+ + +
Represents the response structure for verifying a transaction with IdPay. Inherits properties from TransactionCreateResponseIdPay and modifies the 'data' property.
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + idpay/interfaces/response.interface.ts, line 44 + +

+ +
+ + + + +
+ + +

Extends

+ + + + +
    +
  • Omit +
+ + + + + + + + + + + + + + + +
+

Members

+
+ +
+ + + + +object + + + + +

+ # + + + data + + +

+ + + + +
+ Detailed data related to the verified transaction. +
+ + + + + +
Properties:
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
status + + +string + + + +
track_id + + +string + + + +
id + + +string + + + +
order_id + + +string + + + +
amount + + +string + + + +
date + + +string + + + +
payment + + +PaymentResponseIdPay + + + +
verify + + +object + + + +
date + + +string + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ View Source + + idpay/interfaces/response.interface.ts, line 52 + +

+ +
+ + + + + +
+ +
+
+ + + + + + + +
+ +
+ + + + +
+ + + +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/TransactionVerifyResponseZp.html b/TransactionVerifyResponseZp.html new file mode 100644 index 0000000..8a5c397 --- /dev/null +++ b/TransactionVerifyResponseZp.html @@ -0,0 +1,3 @@ +Interface: TransactionVerifyResponseZp
On this page

TransactionVerifyResponseZp

Represents the response structure for verifying a transaction with ZarinPal.

Members

data :object

Data related to the verified transaction if successful.
Type:
  • object
Properties
NameTypeDescription
codenumber
messagestring
card_hashstring
card_panstring
ref_idnumber
fee_typestring
feenumber

error :TransactionErrorZp

Error details if an error occurred.

isError :boolean

Indicates if there's an error in the response.
Type:
  • boolean
\ No newline at end of file diff --git a/ZarinPalDriver.html b/ZarinPalDriver.html new file mode 100644 index 0000000..42f3b3a --- /dev/null +++ b/ZarinPalDriver.html @@ -0,0 +1,3 @@ +Class: ZarinPalDriver
On this page

ZarinPalDriver

new ZarinPalDriver()

Class to interact with the ZarinPal payment gateway.

Methods

(async) request(data, sandboxopt) → {Promise.<TransactionCreateResponseZp>}

Create a payment request to ZarinPal.
Parameters:
NameTypeAttributesDefaultDescription
dataTransactionCreateInputZpInput data for creating the transaction.
sandboxboolean<optional>
falseFlag to determine whether to use the sandbox environment.
Returns:
Response from the ZarinPal API for creating a transaction.
Type: 
Promise.<TransactionCreateResponseZp>

(async) request(data, sandboxopt) → {Promise.<TransactionCreateResponseZp>}

Create a payment request to ZarinPal.
Parameters:
NameTypeAttributesDefaultDescription
dataTransactionCreateInputZpInput data for creating the transaction.
sandboxboolean<optional>
falseFlag to determine whether to use the sandbox environment.
Returns:
Response from the ZarinPal API for creating a transaction.
Type: 
Promise.<TransactionCreateResponseZp>

setToken(merchant_id) → {this}

Set the merchant ID for the ZarinPal driver.
Parameters:
NameTypeDescription
merchant_idstringThe merchant ID to set.
Returns:
Instance of ZarinPalDriver.
Type: 
this

setToken(merchant_id) → {this}

Set the merchant ID for the ZarinPal driver.
Parameters:
NameTypeDescription
merchant_idstringThe merchant ID to set.
Returns:
Instance of ZarinPalDriver.
Type: 
this

(async) verify(data, sandboxopt) → {Promise.<TransactionVerifyResponseZp>}

Verify a payment transaction with ZarinPal.
Parameters:
NameTypeAttributesDefaultDescription
dataTransactionVerifyInputZpInput data for verifying the transaction.
sandboxboolean<optional>
falseFlag to determine whether to use the sandbox environment.
Returns:
Response from the ZarinPal API for verifying a transaction.
Type: 
Promise.<TransactionVerifyResponseZp>

(async) verify(data, sandboxopt) → {Promise.<TransactionVerifyResponseZp>}

Verify a payment transaction with ZarinPal.
Parameters:
NameTypeAttributesDefaultDescription
dataTransactionVerifyInputZpInput data for verifying the transaction.
sandboxboolean<optional>
falseFlag to determine whether to use the sandbox environment.
Returns:
Response from the ZarinPal API for verifying a transaction.
Type: 
Promise.<TransactionVerifyResponseZp>
\ No newline at end of file diff --git a/data/search.json b/data/search.json new file mode 100644 index 0000000..6babe0f --- /dev/null +++ b/data/search.json @@ -0,0 +1 @@ +{"list":[{"title":"IdPayDriver","link":"IdPayDriver","description":"Class that provides methods to interact with the IdPay API."},{"title":"IdPayDriver#request","link":"request","description":"Request method to create a transaction."},{"title":"IdPayDriver#request","link":"request","description":"Request method to create a transaction."},{"title":"IdPayDriver#setSandBox","link":"setSandBox","description":"Set whether to use the sandbox environment or not."},{"title":"IdPayDriver#setSandBox","link":"setSandBox","description":"Set whether to use the sandbox environment or not."},{"title":"IdPayDriver#setToken","link":"setToken","description":"Set the API token for authentication."},{"title":"IdPayDriver#setToken","link":"setToken","description":"Set the API token for authentication."},{"title":"IdPayDriver#verify","link":"verify","description":"Verify method to verify a transaction."},{"title":"IdPayDriver#verify","link":"verify","description":"Verify method to verify a transaction."},{"title":"IdPayUrls","link":"IdPayUrls","description":"Enum representing URLs for interacting with the IdPay API."},{"title":"IdPayUrls.IdPayUrls[\"REQUEST\"]","link":"IdPayUrls[\"REQUEST\"]","description":"URL for creating a payment request."},{"title":"IdPayUrls.IdPayUrls[\"VERIFY\"]","link":"IdPayUrls[\"VERIFY\"]","description":"URL for verifying a payment."},{"title":"PaymentResponseIdPay","link":"PaymentResponseIdPay","description":"Represents the payment details in the response for IdPay."},{"title":"PaymentResponseIdPay#amount","link":"amount","description":"Amount associated with the payment."},{"title":"PaymentResponseIdPay#card_no","link":"card_no","description":"Card number used for the payment."},{"title":"PaymentResponseIdPay#date","link":"date","description":"Date of the payment."},{"title":"PaymentResponseIdPay#hashed_card_no","link":"hashed_card_no","description":"Hashed card number for security reasons."},{"title":"PaymentResponseIdPay#track_id","link":"track_id","description":"Tracking ID for the payment."},{"title":"TransactionCreateInputIdPay","link":"TransactionCreateInputIdPay","description":"Represents the input structure for creating a transaction with IdPay."},{"title":"TransactionCreateInputIdPay#amount","link":"amount","description":"Desired amount in Rials.\rAmount must be between 1,000 Rials to 500,000,000 Rials."},{"title":"TransactionCreateInputIdPay#callback","link":"callback","description":"Merchant's callback URL.\rMaximum length: 2048 characters."},{"title":"TransactionCreateInputIdPay#desc","link":"desc","description":"Transaction description.\rMaximum length: 255 characters."},{"title":"TransactionCreateInputIdPay#mail","link":"mail","description":"Email address of the payer.\rMaximum length: 255 characters."},{"title":"TransactionCreateInputIdPay#name","link":"name","description":"Name of the payer.\rMaximum length: 255 characters."},{"title":"TransactionCreateInputIdPay#order_id","link":"order_id","description":"Merchant order ID.\rMaximum length: 50 characters."},{"title":"TransactionCreateInputIdPay#phone","link":"phone","description":"Mobile number of the payer.\rLength should be 11 characters.\rExamples: 9382198592, 09382198592, 989382198592."},{"title":"TransactionCreateInputIdPay#token","link":"token","description":"The token for authentication, if available."},{"title":"TransactionCreateInputZp","link":"TransactionCreateInputZp","description":"Represents the input structure for creating a transaction with ZarinPal."},{"title":"TransactionCreateInputZp#amount","link":"amount","description":"Amount for the transaction."},{"title":"TransactionCreateInputZp#callback_url","link":"callback_url","description":"Callback URL to redirect after the transaction."},{"title":"TransactionCreateInputZp#currency","link":"currency","description":"Currency type for the transaction, either \"IRR\" or \"IRT\"."},{"title":"TransactionCreateInputZp#description","link":"description","description":"Description for the transaction."},{"title":"TransactionCreateInputZp#merchant_id","link":"merchant_id","description":"Merchant ID, if available."},{"title":"TransactionCreateInputZp#metadata","link":"metadata","description":"Additional metadata for the transaction."},{"title":"TransactionCreateResponseIdPay","link":"TransactionCreateResponseIdPay","description":"Represents the response structure for creating a transaction with IdPay."},{"title":"TransactionCreateResponseIdPay#data","link":"data","description":"Data related to the transaction if successful."},{"title":"TransactionCreateResponseIdPay#error_code","link":"error_code","description":"Error code if an error occurred, otherwise null."},{"title":"TransactionCreateResponseIdPay#error_message","link":"error_message","description":"Error message if an error occurred, otherwise null."},{"title":"TransactionCreateResponseIdPay#isError","link":"isError","description":"Indicates if there's an error in the response."},{"title":"TransactionCreateResponseZp","link":"TransactionCreateResponseZp","description":"Represents the response structure for creating a transaction with ZarinPal."},{"title":"TransactionCreateResponseZp#data","link":"data","description":"Data related to the transaction if successful."},{"title":"TransactionCreateResponseZp#error","link":"error","description":"Error details if an error occurred."},{"title":"TransactionCreateResponseZp#isError","link":"isError","description":"Indicates if there's an error in the response."},{"title":"TransactionErrorZp","link":"TransactionErrorZp","description":"Represents the error structure for ZarinPal transactions."},{"title":"TransactionErrorZp#code","link":"code","description":"Error code."},{"title":"TransactionErrorZp#message","link":"message","description":"Error message."},{"title":"TransactionErrorZp#validations","link":"validations","description":"Validation errors related to the transaction input."},{"title":"TransactionVerifyInputIdPay","link":"TransactionVerifyInputIdPay","description":"Represents the input structure for verifying a transaction with IdPay.\rInherits properties 'order_id' and 'token' from TransactionCreateInputIdPay."},{"title":"TransactionVerifyInputIdPay#id","link":"id","description":"Transaction ID."},{"title":"TransactionVerifyInputZp","link":"TransactionVerifyInputZp","description":"Represents the input structure for verifying a transaction with ZarinPal.\rInherits properties 'merchant_id' and 'amount' from TransactionCreateInputZp."},{"title":"TransactionVerifyInputZp#authority","link":"authority","description":"Transaction authority."},{"title":"TransactionVerifyResponseIdPay","link":"TransactionVerifyResponseIdPay","description":"Represents the response structure for verifying a transaction with IdPay.\rInherits properties from TransactionCreateResponseIdPay and modifies the 'data' property."},{"title":"TransactionVerifyResponseIdPay#data","link":"data","description":"Detailed data related to the verified transaction."},{"title":"TransactionVerifyResponseZp","link":"TransactionVerifyResponseZp","description":"Represents the response structure for verifying a transaction with ZarinPal."},{"title":"TransactionVerifyResponseZp#data","link":"data","description":"Data related to the verified transaction if successful."},{"title":"TransactionVerifyResponseZp#error","link":"error","description":"Error details if an error occurred."},{"title":"TransactionVerifyResponseZp#isError","link":"isError","description":"Indicates if there's an error in the response."},{"title":"ZarinPalDriver","link":"ZarinPalDriver","description":"Class to interact with the ZarinPal payment gateway."},{"title":"ZarinPalDriver#request","link":"request","description":"Create a payment request to ZarinPal."},{"title":"ZarinPalDriver#request","link":"request","description":"Create a payment request to ZarinPal."},{"title":"ZarinPalDriver#setToken","link":"setToken","description":"Set the merchant ID for the ZarinPal driver."},{"title":"ZarinPalDriver#setToken","link":"setToken","description":"Set the merchant ID for the ZarinPal driver."},{"title":"ZarinPalDriver#verify","link":"verify","description":"Verify a payment transaction with ZarinPal."},{"title":"ZarinPalDriver#verify","link":"verify","description":"Verify a payment transaction with ZarinPal."},{"title":"ZarinpalUrls","link":"ZarinpalUrls","description":"Enum representing URLs for interacting with the ZarinPal API endpoints."},{"title":"ZarinpalUrls.ZarinpalUrls[\"REQUEST\"]","link":"ZarinpalUrls[\"REQUEST\"]","description":"URL for creating a payment request in the production environment."},{"title":"ZarinpalUrls.ZarinpalUrls[\"REQUEST_PAGE\"]","link":"ZarinpalUrls[\"REQUEST_PAGE\"]","description":"URL for the payment page in the production environment."},{"title":"ZarinpalUrls.ZarinpalUrls[\"SANDBOX_REQUEST\"]","link":"ZarinpalUrls[\"SANDBOX_REQUEST\"]","description":"URL for creating a payment request in the sandbox environment."},{"title":"ZarinpalUrls.ZarinpalUrls[\"SANDBOX_REQUEST_PAGE\"]","link":"ZarinpalUrls[\"SANDBOX_REQUEST_PAGE\"]","description":"URL for the payment page in the sandbox environment."},{"title":"ZarinpalUrls.ZarinpalUrls[\"SANDBOX_VERIFY\"]","link":"ZarinpalUrls[\"SANDBOX_VERIFY\"]","description":"URL for verifying a payment in the sandbox environment."},{"title":"ZarinpalUrls.ZarinpalUrls[\"VERIFY\"]","link":"ZarinpalUrls[\"VERIFY\"]","description":"URL for verifying a payment in the production environment."},{"title":"zarinPalErrors","link":"zarinPalErrors","description":"Object containing error codes and their corresponding descriptions for ZarinPal payment gateway.\r\rThis list is based on the official documentation provided by ZarinPal."}]} \ No newline at end of file diff --git a/fonts/Inconsolata-Regular.ttf b/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..457d262cf5ec2f0555fcb8d38fefaa67af315a11 GIT binary patch literal 97864 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Regular.ttf b/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e21ff5f1ec01719e9e699df260db5be8b220aa2a GIT binary patch literal 129796 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
  • 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 CDHovt literal 0 HcmV?d00001 diff --git a/fonts/WorkSans-Bold.ttf b/fonts/WorkSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0caaf4d4ddbebc309554574b611d24435d5a8045 GIT binary patch literal 192548 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

    -$ z8o`zPHLk_o0SB%-?OSiTmMho0k*euiuE;wFxn2k4s_EM_-_l_xjUNY+#FJ*cPM*x@ zjQfdu@q&~*Px{Wd7jQR;)lc$V>RrZ^q1cN@v??nvgJg<~*dFB3rr=&s=`u_rFOgi@f literal 0 HcmV?d00001 diff --git a/global.html b/global.html new file mode 100644 index 0000000..1de7892 --- /dev/null +++ b/global.html @@ -0,0 +1,3 @@ +Global

    On this page

    Members

    IdPayUrls :string

    Enum representing URLs for interacting with the IdPay API.
    Type:
    • string

    ZarinpalUrls :string

    Enum representing URLs for interacting with the ZarinPal API endpoints.
    Type:
    • string

    (constant) zarinPalErrors

    Object containing error codes and their corresponding descriptions for ZarinPal payment gateway. This list is based on the official documentation provided by ZarinPal.
    \ No newline at end of file diff --git a/idpay_enums_urls.enum.ts.html b/idpay_enums_urls.enum.ts.html new file mode 100644 index 0000000..8f50b41 --- /dev/null +++ b/idpay_enums_urls.enum.ts.html @@ -0,0 +1,24 @@ +Source: idpay/enums/urls.enum.ts
    On this page

    idpay_enums_urls.enum.ts

    /**
    + * Enum representing URLs for interacting with the IdPay API.
    + * 
    + * @enum {string}
    + */
    +export enum IdPayUrls {
    +  /**
    +   * URL for creating a payment request.
    +   * 
    +   * @type {string}
    +   * @memberof IdPayUrls
    + */
    +  REQUEST = "https://api.idpay.ir/v1.1/payment",
    +  /**
    +   * URL for verifying a payment.
    +   * 
    +   * @type {string}
    +   * @memberof IdPayUrls
    + */
    +  VERIFY = "https://api.idpay.ir/v1.1/payment/verify",
    +}
    +
    \ No newline at end of file diff --git a/idpay_idpay.ts.html b/idpay_idpay.ts.html new file mode 100644 index 0000000..ddc9a2e --- /dev/null +++ b/idpay_idpay.ts.html @@ -0,0 +1,128 @@ +Source: idpay/idpay.ts
    On this page

    idpay_idpay.ts

    import axios from "axios";
    +import { IdPayUrls } from "./enums/urls.enum";
    +import {
    +  TransactionCreateInputIdPay,
    +  TransactionVerifyInputIdPay,
    +} from "./interfaces/request.interface";
    +import {
    +  TransactionCreateResponseIdPay,
    +  TransactionVerifyResponseIdPay,
    +} from "./interfaces/response.interface";
    +
    +/**
    + * Class that provides methods to interact with the IdPay API.
    + * 
    + * @class IdPayDriver
    + */
    +export class IdPayDriver {
    +  private token: string | null = null;
    +  private sandBox: boolean = false;
    +
    +  /**
    +   * Set the API token for authentication.
    +   * 
    +   * @param {string} token - The API token.
    +   * @returns {this} Instance of IdPayDriver.
    + */
    +  setToken(token: string): this {
    +    this.token = token;
    +    return this;
    +  }
    +
    +  /**
    +    * Set whether to use the sandbox environment or not.
    +    * 
    +    * @param {boolean} sandBox - True to use sandbox, false otherwise.
    +    * @returns {this} Instance of IdPayDriver.
    +  */
    +  setSandBox(sandBox: boolean): this {
    +    this.sandBox = sandBox;
    +    return this;
    +  }
    +
    +  /**
    +   * Request method to create a transaction.
    +   * 
    +   * @param {TransactionCreateInputIdPay} dataInput - Input data for creating the transaction.
    +   * @returns {Promise<TransactionCreateResponseIdPay>} Response from the IdPay API for creating a transaction.
    + */
    +  async request(
    +    dataInput: TransactionCreateInputIdPay,
    +  ): Promise<TransactionCreateResponseIdPay> {
    +    try {
    +      const { data } = await axios.post(IdPayUrls.REQUEST, dataInput, {
    +        headers: this.getHeader(this.token || dataInput.token, this.sandBox),
    +      });
    +      return {
    +        isError: false,
    +        data: {
    +          id: data.id,
    +          link: data.link,
    +        },
    +        error_code: null,
    +        error_message: null,
    +      };
    +    } catch (error: any) {
    +      if (error.isAxiosError) {
    +        return {
    +          isError: true,
    +          error_message: error.response.data.error_message,
    +          error_code: error.response.data.error_code,
    +          data: {} as any,
    +        };
    +      } else throw error;
    +    }
    +  }
    +
    +  /**
    +   * Verify method to verify a transaction.
    +   * 
    +   * @param {TransactionVerifyInputIdPay} dataInput - Input data for verifying the transaction.
    +   * @returns {Promise<TransactionVerifyResponseIdPay>} Response from the IdPay API for verifying a transaction.
    + */
    +  async verify(
    +    dataInput: TransactionVerifyInputIdPay,
    +  ): Promise<TransactionVerifyResponseIdPay> {
    +    try {
    +      const { data } = await axios.post(IdPayUrls.VERIFY, dataInput, {
    +        headers: this.getHeader(this.token || dataInput.token, this.sandBox),
    +      });
    +      return {
    +        isError: false,
    +        error_message: null,
    +        error_code: null,
    +        data: data,
    +      };
    +    } catch (error: any) {
    +      if (error.isAxiosError) {
    +        return {
    +          isError: true,
    +          error_message: error.response.data.error_message,
    +          error_code: error.response.data.error_code,
    +          data: {} as any,
    +        };
    +      } else throw error;
    +    }
    +  }
    +
    +  /**
    +   * Generate headers for the HTTP requests.
    +   * 
    +   * @private
    +   * @param {string | undefined} token - API token.
    +   * @param {boolean} sandbox - Whether sandbox environment should be used.
    +   * @returns {Record<string, string>} Headers for the HTTP request.
    +   * @throws {Error} Throws an error if token is not provided.
    + */
    +  private getHeader(token: string | undefined, sandbox: boolean) {
    +    if (!token) throw new Error("token is required");
    +    return {
    +      "Content-Type": "application/json",
    +      "X-API-KEY": token,
    +      "X-SANDBOX": sandbox,
    +    };
    +  }
    +}
    +
    \ No newline at end of file diff --git a/idpay_interfaces_request.interface.ts.html b/idpay_interfaces_request.interface.ts.html new file mode 100644 index 0000000..3a8780b --- /dev/null +++ b/idpay_interfaces_request.interface.ts.html @@ -0,0 +1,98 @@ +Source: idpay/interfaces/request.interface.ts
    On this page

    idpay_interfaces_request.interface.ts

    /**
    + * Represents the input structure for creating a transaction with IdPay.
    + * 
    + * @interface TransactionCreateInputIdPay
    + */
    +export interface TransactionCreateInputIdPay {
    +  /**
    +   * The token for authentication, if available.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  token?: string;
    +
    +  /**
    +   * Merchant order ID.
    +   * Maximum length: 50 characters.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  order_id: string;
    +
    +  /**
    +   * Desired amount in Rials.
    +   * Amount must be between 1,000 Rials to 500,000,000 Rials.
    +   * 
    +   * @type {number}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  amount: number;
    +
    +  /**
    +   * Name of the payer.
    +   * Maximum length: 255 characters.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  name?: string;
    +
    +  /**
    +   * Mobile number of the payer.
    +   * Length should be 11 characters.
    +   * Examples: 9382198592, 09382198592, 989382198592.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  phone?: string;
    +
    +  /**
    +   * Email address of the payer.
    +   * Maximum length: 255 characters.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  mail?: string;
    +
    +  /**
    +   * Transaction description.
    +   * Maximum length: 255 characters.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  desc: string;
    +
    +  /**
    +   * Merchant's callback URL.
    +   * Maximum length: 2048 characters.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionCreateInputIdPay
    +   */
    +  callback: string;
    +}
    +
    +/**
    + * Represents the input structure for verifying a transaction with IdPay.
    + * Inherits properties 'order_id' and 'token' from TransactionCreateInputIdPay.
    + * 
    + * @interface TransactionVerifyInputIdPay
    + * @extends {Pick<TransactionCreateInputIdPay, "order_id" | "token">}
    + */
    +export interface TransactionVerifyInputIdPay extends Pick<TransactionCreateInputIdPay, "order_id" | "token"> {
    +  /**
    +   * Transaction ID.
    +   * 
    +   * @type {string}
    +   * @memberof TransactionVerifyInputIdPay
    +   */
    +  id: string;
    +}
    +
    \ No newline at end of file diff --git a/idpay_interfaces_response.interface.ts.html b/idpay_interfaces_response.interface.ts.html new file mode 100644 index 0000000..51984a5 --- /dev/null +++ b/idpay_interfaces_response.interface.ts.html @@ -0,0 +1,119 @@ +Source: idpay/interfaces/response.interface.ts
    On this page

    idpay_interfaces_response.interface.ts

    /**
    + * Represents the response structure for creating a transaction with IdPay.
    + * 
    + * @interface TransactionCreateResponseIdPay
    + */
    +export interface TransactionCreateResponseIdPay {
    +  /**
    +   * Indicates if there's an error in the response.
    +   * 
    +   * @type {boolean}
    +   * @memberof TransactionCreateResponseIdPay
    +   */
    +  isError: boolean;
    +
    +  /**
    +   * Data related to the transaction if successful.
    +   * 
    +   * @type {{ id: string; link: string; }}
    +   * @memberof TransactionCreateResponseIdPay
    +   */
    +  data: {
    +    id: string;
    +    link: string;
    +  };
    +
    +  /**
    +   * Error code if an error occurred, otherwise null.
    +   * 
    +   * @type {string | null}
    +   * @memberof TransactionCreateResponseIdPay
    +   */
    +  error_code: string | null;
    +
    +  /**
    +   * Error message if an error occurred, otherwise null.
    +   * 
    +   * @type {string | null}
    +   * @memberof TransactionCreateResponseIdPay
    +   */
    +  error_message: string | null;
    +}
    +
    +/**
    + * Represents the response structure for verifying a transaction with IdPay.
    + * Inherits properties from TransactionCreateResponseIdPay and modifies the 'data' property.
    + * 
    + * @interface TransactionVerifyResponseIdPay
    + * @extends {Omit<TransactionCreateResponseIdPay, "data">}
    + */
    +export interface TransactionVerifyResponseIdPay extends Omit<TransactionCreateResponseIdPay, "data"> {
    +  /**
    +   * Detailed data related to the verified transaction.
    +   * 
    +   * @type {{ status: string; track_id: string; id: string; order_id: string; amount: string; date: string; payment: PaymentResponseIdPay; verify: { date: string; }; }}
    +   * @memberof TransactionVerifyResponseIdPay
    +   */
    +  data: {
    +    status: string;
    +    track_id: string;
    +    id: string;
    +    order_id: string;
    +    amount: string;
    +    date: string;
    +    payment: PaymentResponseIdPay;
    +    verify: {
    +      date: string;
    +    };
    +  };
    +}
    +
    +/**
    + * Represents the payment details in the response for IdPay.
    + * 
    + * @interface PaymentResponseIdPay
    + */
    +export interface PaymentResponseIdPay {
    +  /**
    +   * Tracking ID for the payment.
    +   * 
    +   * @type {string}
    +   * @memberof PaymentResponseIdPay
    +   */
    +  track_id: string;
    +
    +  /**
    +   * Amount associated with the payment.
    +   * 
    +   * @type {string}
    +   * @memberof PaymentResponseIdPay
    +   */
    +  amount: string;
    +
    +  /**
    +   * Card number used for the payment.
    +   * 
    +   * @type {string}
    +   * @memberof PaymentResponseIdPay
    +   */
    +  card_no: string;
    +
    +  /**
    +   * Hashed card number for security reasons.
    +   * 
    +   * @type {string}
    +   * @memberof PaymentResponseIdPay
    +   */
    +  hashed_card_no: string;
    +
    +  /**
    +   * Date of the payment.
    +   * 
    +   * @type {string}
    +   * @memberof PaymentResponseIdPay
    +   */
    +  date: string;
    +}
    +
    \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..4a4bb84 --- /dev/null +++ b/index.html @@ -0,0 +1,3 @@ +Home
    On this page

    soon

    \ No newline at end of file diff --git a/scripts/app.min.js b/scripts/app.min.js new file mode 100644 index 0000000..9411fc0 --- /dev/null +++ b/scripts/app.min.js @@ -0,0 +1 @@ +"use strict";$().ready(function(){});var sidebarIsVisible=!1,toggleSidebar=function(e){var a=!(0 h1").text();if(t){o.append($("

    ").text(t));var s=$("
      ");i.find(".members h4.name").each(function(e,a){var i=$(a),t=i.find(".code-name").clone().children().remove().end().text(),n=i.find("a").attr("href"),r=$('')).text(t);s.append($("
    • ").append(r)),c.push({link:r,offset:i.offset().top})}),o.append(s)}else i.find(".members h4.name").each(function(e,a){var i=$(a),t=i.find(".code-name").clone().children().remove().end().text(),n=i.find("a").attr("href"),r=$('
      ')).text(t);o.append(r),c.push({link:r,offset:i.offset().top})})}),!$.trim(o.text()))return o.hide();function e(){for(var e=n.scrollTop(),a=!1,i=c.length-1;0<=i;i--){var t=c[i];t.link.removeClass("is-active"),e+OFFSET>=t.offset?a?t.link.addClass("is-past"):(t.link.addClass("is-active"),a=!0):t.link.removeClass("is-past")}}var n=$("#main-content-wrapper");n.on("scroll",e),e(),c.forEach(function(e){e.link.click(function(){n.animate({scrollTop:e.offset-OFFSET+1},500)})})}),$().ready(function(){$("#sidebarNav a").each(function(e,a){var i=$(a).attr("href");window.location.pathname.match("/"+i)&&($(a).addClass("active"),$("#sidebarNav").scrollTop($(a).offset().top-150))})}); \ No newline at end of file diff --git a/scripts/core.js b/scripts/core.js new file mode 100644 index 0000000..fff74ca --- /dev/null +++ b/scripts/core.js @@ -0,0 +1,702 @@ +/* global document */ +var accordionLocalStorageKey = 'accordion-id'; +var themeLocalStorageKey = 'theme'; +var fontSizeLocalStorageKey = 'font-size'; +var html = document.querySelector('html'); + +var MAX_FONT_SIZE = 30; +var MIN_FONT_SIZE = 10; + +// eslint-disable-next-line no-undef +var localStorage = window.localStorage; + +function getTheme() { + var theme = localStorage.getItem(themeLocalStorageKey); + + if (theme) return theme; + + theme = document.body.getAttribute('data-theme'); + + switch (theme) { + case 'dark': + case 'light': + return theme; + case 'fallback-dark': + if ( + // eslint-disable-next-line no-undef + window.matchMedia('(prefers-color-scheme)').matches && + // eslint-disable-next-line no-undef + window.matchMedia('(prefers-color-scheme: light)').matches + ) { + return 'light'; + } + + return 'dark'; + + case 'fallback-light': + if ( + // eslint-disable-next-line no-undef + window.matchMedia('(prefers-color-scheme)').matches && + // eslint-disable-next-line no-undef + window.matchMedia('(prefers-color-scheme: dark)').matches + ) { + return 'dark'; + } + + return 'light'; + + default: + return 'dark'; + } +} + +function localUpdateTheme(theme) { + var body = document.body; + var svgUse = document.querySelectorAll('.theme-svg-use'); + var iconID = theme === 'dark' ? '#light-theme-icon' : '#dark-theme-icon'; + + body.setAttribute('data-theme', theme); + body.classList.remove('dark', 'light'); + body.classList.add(theme); + + svgUse.forEach(function (svg) { + svg.setAttribute('xlink:href', iconID); + }); +} + +function updateTheme(theme) { + localUpdateTheme(theme); + localStorage.setItem(themeLocalStorageKey, theme); +} + +function toggleTheme() { + var body = document.body; + var theme = body.getAttribute('data-theme'); + + var newTheme = theme === 'dark' ? 'light' : 'dark'; + + updateTheme(newTheme); +} + +(function () { + var theme = getTheme(); + + updateTheme(theme); +})(); + +/** + * Function to set accordion id to localStorage. + * @param {string} id Accordion id + */ +function setAccordionIdToLocalStorage(id) { + /** + * @type {object} + */ + var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey)); + + ids[id] = id; + localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids)); +} + +/** + * Function to remove accordion id from localStorage. + * @param {string} id Accordion id + */ +function removeAccordionIdFromLocalStorage(id) { + /** + * @type {object} + */ + var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey)); + + delete ids[id]; + localStorage.setItem(accordionLocalStorageKey, JSON.stringify(ids)); +} + +/** + * Function to get all accordion ids from localStorage. + * + * @returns {object} + */ +function getAccordionIdsFromLocalStorage() { + /** + * @type {object} + */ + var ids = JSON.parse(localStorage.getItem(accordionLocalStorageKey)); + + return ids || {}; +} + +function toggleAccordion(element) { + var currentNode = element; + var isCollapsed = currentNode.getAttribute('data-isopen') === 'false'; + + if (isCollapsed) { + currentNode.setAttribute('data-isopen', 'true'); + setAccordionIdToLocalStorage(currentNode.id); + } else { + currentNode.setAttribute('data-isopen', 'false'); + removeAccordionIdFromLocalStorage(currentNode.id); + } +} + +function initAccordion() { + if ( + localStorage.getItem(accordionLocalStorageKey) === undefined || + localStorage.getItem(accordionLocalStorageKey) === null + ) { + localStorage.setItem(accordionLocalStorageKey, '{}'); + } + var allAccordion = document.querySelectorAll('.sidebar-section-title'); + var ids = getAccordionIdsFromLocalStorage(); + + allAccordion.forEach(function (item) { + item.addEventListener('click', function () { + toggleAccordion(item); + }); + if (item.id in ids) { + toggleAccordion(item); + } + }); +} + +function isSourcePage() { + return Boolean(document.querySelector('#source-page')); +} + +function bringElementIntoView(element, updateHistory = true) { + // If element is null then we are not going further + if (!element) { + return; + } + + /** + * tocbotInstance is defined in layout.tmpl + * It is defined when we are initializing tocbot. + * + */ + // eslint-disable-next-line no-undef + if (tocbotInstance) { + setTimeout( + // eslint-disable-next-line no-undef + () => tocbotInstance.updateTocListActiveElement(element), + 60 + ); + } + var navbar = document.querySelector('.navbar-container'); + var body = document.querySelector('.main-content'); + var elementTop = element.getBoundingClientRect().top; + + var offset = 16; + + if (navbar) { + offset += navbar.scrollHeight; + } + + if (body) { + body.scrollBy(0, elementTop - offset); + } + + if (updateHistory) { + // eslint-disable-next-line no-undef + history.pushState(null, null, '#' + element.id); + } +} + +// eslint-disable-next-line no-unused-vars +function bringLinkToView(event) { + event.preventDefault(); + event.stopPropagation(); + var id = event.currentTarget.getAttribute('href'); + + if (!id) { + return; + } + + var element = document.getElementById(id.slice(1)); + + if (element) { + bringElementIntoView(element); + } +} + +function bringIdToViewOnMount() { + if (isSourcePage()) { + return; + } + + // eslint-disable-next-line no-undef + var id = window.location.hash; + + if (id === '') { + return; + } + + var element = document.getElementById(id.slice(1)); + + if (!element) { + id = decodeURI(id); + element = document.getElementById(id.slice(1)); + } + + if (element) { + bringElementIntoView(element, false); + } +} + +function createAnchorElement(id) { + var anchor = document.createElement('a'); + + anchor.textContent = '#'; + anchor.href = '#' + id; + anchor.classList.add('link-anchor'); + anchor.onclick = bringLinkToView; + + return anchor; +} + +function addAnchor() { + var main = document.querySelector('.main-content').querySelector('section'); + + var h1 = main.querySelectorAll('h1'); + var h2 = main.querySelectorAll('h2'); + var h3 = main.querySelectorAll('h3'); + var h4 = main.querySelectorAll('h4'); + + var targets = [h1, h2, h3, h4]; + + targets.forEach(function (target) { + target.forEach(function (heading) { + var anchor = createAnchorElement(heading.id); + + heading.classList.add('has-anchor'); + heading.append(anchor); + }); + }); +} + +/** + * + * @param {string} value + */ +function copy(value) { + const el = document.createElement('textarea'); + + el.value = value; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); +} + +function showTooltip(id) { + var tooltip = document.getElementById(id); + + tooltip.classList.add('show-tooltip'); + setTimeout(function () { + tooltip.classList.remove('show-tooltip'); + }, 3000); +} + +/* eslint-disable-next-line */ +function copyFunction(id) { + // selecting the pre element + var code = document.getElementById(id); + + // selecting the ol.linenums + var element = code.querySelector('.linenums'); + + if (!element) { + // selecting the code block + element = code.querySelector('code'); + } + + // copy + copy(element.innerText.trim().replace(/(^\t)/gm, '')); + + // show tooltip + showTooltip('tooltip-' + id); +} + +function hideTocOnSourcePage() { + if (isSourcePage()) { + document.querySelector('.toc-container').style.display = 'none'; + } +} + +function getPreTopBar(id, lang = '') { + // tooltip + var tooltip = '
      Copied!
      '; + + // template of copy to clipboard icon container + var copyToClipboard = + ''; + + var langNameDiv = + '
      ' + + lang.toLocaleUpperCase() + + '
      '; + + var topBar = + '
      ' + + langNameDiv + + copyToClipboard + + '
      '; + + return topBar; +} + +function getPreDiv() { + var divElement = document.createElement('div'); + + divElement.classList.add('pre-div'); + + return divElement; +} + +function processAllPre() { + var targets = document.querySelectorAll('pre'); + var footer = document.querySelector('#PeOAagUepe'); + var navbar = document.querySelector('#VuAckcnZhf'); + + var navbarHeight = 0; + var footerHeight = 0; + + if (footer) { + footerHeight = footer.getBoundingClientRect().height; + } + + if (navbar) { + navbarHeight = navbar.getBoundingClientRect().height; + } + + // eslint-disable-next-line no-undef + var preMaxHeight = window.innerHeight - navbarHeight - footerHeight - 250; + + targets.forEach(function (pre, idx) { + var parent = pre.parentNode; + + if (parent && parent.getAttribute('data-skip-pre-process') === 'true') { + return; + } + + var div = getPreDiv(); + var id = 'ScDloZOMdL' + idx; + + var lang = pre.getAttribute('data-lang') || 'code'; + var topBar = getPreTopBar(id, lang); + + div.innerHTML = topBar; + + pre.style.maxHeight = preMaxHeight + 'px'; + pre.id = id; + pre.classList.add('prettyprint'); + pre.parentNode.insertBefore(div, pre); + div.appendChild(pre); + }); +} + +function highlightAndBringLineIntoView() { + // eslint-disable-next-line no-undef + var lineNumber = window.location.hash.replace('#line', ''); + + try { + var selector = '[data-line-number="' + lineNumber + '"'; + + var element = document.querySelector(selector); + + element.scrollIntoView(); + element.parentNode.classList.add('selected'); + } catch (error) { + console.error(error); + } +} + +function getFontSize() { + var currentFontSize = 16; + + try { + currentFontSize = Number.parseInt( + html.style.fontSize.split('px')[0], + 10 + ); + } catch (error) { + console.log(error); + } + + return currentFontSize; +} + +function localUpdateFontSize(fontSize) { + html.style.fontSize = fontSize + 'px'; + + var fontSizeText = document.querySelector( + '#b77a68a492f343baabea06fad81f651e' + ); + + if (fontSizeText) { + fontSizeText.innerHTML = fontSize; + } +} + +function updateFontSize(fontSize) { + localUpdateFontSize(fontSize); + localStorage.setItem(fontSizeLocalStorageKey, fontSize); +} + +(function () { + var fontSize = getFontSize(); + var fontSizeInLocalStorage = localStorage.getItem(fontSizeLocalStorageKey); + + if (fontSizeInLocalStorage) { + var n = Number.parseInt(fontSizeInLocalStorage, 10); + + if (n === fontSize) { + return; + } + updateFontSize(n); + } else { + updateFontSize(fontSize); + } +})(); + +// eslint-disable-next-line no-unused-vars +function incrementFont(event) { + var n = getFontSize(); + + if (n < MAX_FONT_SIZE) { + updateFontSize(n + 1); + } +} + +// eslint-disable-next-line no-unused-vars +function decrementFont(event) { + var n = getFontSize(); + + if (n > MIN_FONT_SIZE) { + updateFontSize(n - 1); + } +} + +function fontSizeTooltip() { + var fontSize = getFontSize(); + + return ` +
      + +
      + ${fontSize} +
      + + +
      + + `; +} + +function initTooltip() { + // add tooltip to navbar item + // eslint-disable-next-line no-undef + tippy('.theme-toggle', { + content: 'Toggle Theme', + delay: 500, + }); + + // eslint-disable-next-line no-undef + tippy('.search-button', { + content: 'Search', + delay: 500, + }); + + // eslint-disable-next-line no-undef + tippy('.font-size', { + content: 'Change font size', + delay: 500, + }); + + // eslint-disable-next-line no-undef + tippy('.codepen-button', { + content: 'Open code in CodePen', + placement: 'left', + }); + + // eslint-disable-next-line no-undef + tippy('.copy-code', { + content: 'Copy this code', + placement: 'left', + }); + + // eslint-disable-next-line no-undef + tippy('.font-size', { + content: fontSizeTooltip(), + trigger: 'click', + interactive: true, + allowHTML: true, + placement: 'left', + }); +} + +function fixTable() { + const tables = document.querySelectorAll('table'); + + for (const table of tables) { + if (table.classList.contains('hljs-ln')) { + // don't want to wrap code blocks. + return; + } + + var div = document.createElement('div'); + + div.classList.add('table-div'); + table.parentNode.insertBefore(div, table); + div.appendChild(table); + } +} + +function hideMobileMenu() { + var mobileMenuContainer = document.querySelector('#mobile-sidebar'); + var target = document.querySelector('#mobile-menu'); + var svgUse = target.querySelector('use'); + + if (mobileMenuContainer) { + mobileMenuContainer.classList.remove('show'); + } + if (target) { + target.setAttribute('data-isopen', 'false'); + } + if (svgUse) { + svgUse.setAttribute('xlink:href', '#menu-icon'); + } +} + +function showMobileMenu() { + var mobileMenuContainer = document.querySelector('#mobile-sidebar'); + var target = document.querySelector('#mobile-menu'); + var svgUse = target.querySelector('use'); + + if (mobileMenuContainer) { + mobileMenuContainer.classList.add('show'); + } + if (target) { + target.setAttribute('data-isopen', 'true'); + } + if (svgUse) { + svgUse.setAttribute('xlink:href', '#close-icon'); + } +} + +function onMobileMenuClick() { + var target = document.querySelector('#mobile-menu'); + var isOpen = target.getAttribute('data-isopen') === 'true'; + + if (isOpen) { + hideMobileMenu(); + } else { + showMobileMenu(); + } +} + +function initMobileMenu() { + var menu = document.querySelector('#mobile-menu'); + + if (menu) { + menu.addEventListener('click', onMobileMenuClick); + } +} + +function addHrefToSidebarTitle() { + var titles = document.querySelectorAll('.sidebar-title-anchor'); + + titles.forEach(function (title) { + // eslint-disable-next-line no-undef + title.setAttribute('href', baseURL); + }); +} + +function onDomContentLoaded() { + var themeButton = document.querySelectorAll('.theme-toggle'); + + initMobileMenu(); + + if (themeButton) { + themeButton.forEach(function (button) { + button.addEventListener('click', toggleTheme); + }); + } + + // Highlighting code + + // eslint-disable-next-line no-undef + hljs.addPlugin({ + 'after:highlightElement': function (obj) { + // Replace 'code' with result.language when + // we are able to cross-check the correctness of + // result. + obj.el.parentNode.setAttribute('data-lang', 'code'); + }, + }); + // eslint-disable-next-line no-undef + hljs.highlightAll(); + // eslint-disable-next-line no-undef + hljs.initLineNumbersOnLoad({ + singleLine: true, + }); + + // Highlight complete + + initAccordion(); + addAnchor(); + processAllPre(); + hideTocOnSourcePage(); + setTimeout(function () { + bringIdToViewOnMount(); + if (isSourcePage()) { + highlightAndBringLineIntoView(); + } + }, 1000); + initTooltip(); + fixTable(); + addHrefToSidebarTitle(); +} + +// eslint-disable-next-line no-undef +window.addEventListener('DOMContentLoaded', onDomContentLoaded); + +// eslint-disable-next-line no-undef +window.addEventListener('hashchange', (event) => { + const url = new URL(event.newURL); + + if (url.hash !== '') { + bringIdToViewOnMount(url.hash); + } +}); + +// eslint-disable-next-line no-undef +window.addEventListener('storage', (event) => { + if (event.newValue === 'undefined') return; + + initTooltip(); + + if (event.key === themeLocalStorageKey) localUpdateTheme(event.newValue); + if (event.key === fontSizeLocalStorageKey) + localUpdateFontSize(event.newValue); +}); diff --git a/scripts/core.min.js b/scripts/core.min.js new file mode 100644 index 0000000..6165f9f --- /dev/null +++ b/scripts/core.min.js @@ -0,0 +1,23 @@ +var accordionLocalStorageKey="accordion-id",themeLocalStorageKey="theme",fontSizeLocalStorageKey="font-size",html=document.querySelector("html"),MAX_FONT_SIZE=30,MIN_FONT_SIZE=10,localStorage=window.localStorage;function getTheme(){var e=localStorage.getItem(themeLocalStorageKey);if(e)return e;switch(e=document.body.getAttribute("data-theme")){case"dark":case"light":return e;case"fallback-dark":return window.matchMedia("(prefers-color-scheme)").matches&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";case"fallback-light":return window.matchMedia("(prefers-color-scheme)").matches&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";default:return"dark"}}function localUpdateTheme(e){var t=document.body,o=document.querySelectorAll(".theme-svg-use"),n="dark"===e?"#light-theme-icon":"#dark-theme-icon";t.setAttribute("data-theme",e),t.classList.remove("dark","light"),t.classList.add(e),o.forEach(function(e){e.setAttribute("xlink:href",n)})}function updateTheme(e){localUpdateTheme(e),localStorage.setItem(themeLocalStorageKey,e)}function toggleTheme(){updateTheme("dark"===document.body.getAttribute("data-theme")?"light":"dark")}function setAccordionIdToLocalStorage(e){var t=JSON.parse(localStorage.getItem(accordionLocalStorageKey));t[e]=e,localStorage.setItem(accordionLocalStorageKey,JSON.stringify(t))}function removeAccordionIdFromLocalStorage(e){var t=JSON.parse(localStorage.getItem(accordionLocalStorageKey));delete t[e],localStorage.setItem(accordionLocalStorageKey,JSON.stringify(t))}function getAccordionIdsFromLocalStorage(){return JSON.parse(localStorage.getItem(accordionLocalStorageKey))||{}}function toggleAccordion(e){"false"===e.getAttribute("data-isopen")?(e.setAttribute("data-isopen","true"),setAccordionIdToLocalStorage(e.id)):(e.setAttribute("data-isopen","false"),removeAccordionIdFromLocalStorage(e.id))}function initAccordion(){void 0!==localStorage.getItem(accordionLocalStorageKey)&&null!==localStorage.getItem(accordionLocalStorageKey)||localStorage.setItem(accordionLocalStorageKey,"{}");var e=document.querySelectorAll(".sidebar-section-title"),t=getAccordionIdsFromLocalStorage();e.forEach(function(e){e.addEventListener("click",function(){toggleAccordion(e)}),e.id in t&&toggleAccordion(e)})}function isSourcePage(){return Boolean(document.querySelector("#source-page"))}function bringElementIntoView(e,t=!0){var o,n,i,c;e&&(tocbotInstance&&setTimeout(()=>tocbotInstance.updateTocListActiveElement(e),60),o=document.querySelector(".navbar-container"),n=document.querySelector(".main-content"),i=e.getBoundingClientRect().top,c=16,o&&(c+=o.scrollHeight),n&&n.scrollBy(0,i-c),t&&history.pushState(null,null,"#"+e.id))}function bringLinkToView(e){e.preventDefault(),e.stopPropagation();var e=e.currentTarget.getAttribute("href");!e||(e=document.getElementById(e.slice(1)))&&bringElementIntoView(e)}function bringIdToViewOnMount(){var e,t;isSourcePage()||""!==(e=window.location.hash)&&((t=document.getElementById(e.slice(1)))||(e=decodeURI(e),t=document.getElementById(e.slice(1))),t&&bringElementIntoView(t,!1))}function createAnchorElement(e){var t=document.createElement("a");return t.textContent="#",t.href="#"+e,t.classList.add("link-anchor"),t.onclick=bringLinkToView,t}function addAnchor(){var e=document.querySelector(".main-content").querySelector("section");[e.querySelectorAll("h1"),e.querySelectorAll("h2"),e.querySelectorAll("h3"),e.querySelectorAll("h4")].forEach(function(e){e.forEach(function(e){var t=createAnchorElement(e.id);e.classList.add("has-anchor"),e.append(t)})})}function copy(e){const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}function showTooltip(e){var t=document.getElementById(e);t.classList.add("show-tooltip"),setTimeout(function(){t.classList.remove("show-tooltip")},3e3)}function copyFunction(e){var t=document.getElementById(e);copy((t.querySelector(".linenums")||t.querySelector("code")).innerText.trim().replace(/(^\t)/gm,"")),showTooltip("tooltip-"+e)}function hideTocOnSourcePage(){isSourcePage()&&(document.querySelector(".toc-container").style.display="none")}function getPreTopBar(e,t=""){e='";return'
      '+('
      '+t.toLocaleUpperCase()+"
      ")+e+"
      "}function getPreDiv(){var e=document.createElement("div");return e.classList.add("pre-div"),e}function processAllPre(){var e=document.querySelectorAll("pre"),t=document.querySelector("#PeOAagUepe"),o=document.querySelector("#VuAckcnZhf"),n=0,i=0,c=(t&&(i=t.getBoundingClientRect().height),o&&(n=o.getBoundingClientRect().height),window.innerHeight-n-i-250);e.forEach(function(e,t){var o,n=e.parentNode;n&&"true"===n.getAttribute("data-skip-pre-process")||(n=getPreDiv(),o=getPreTopBar(t="ScDloZOMdL"+t,e.getAttribute("data-lang")||"code"),n.innerHTML=o,e.style.maxHeight=c+"px",e.id=t,e.classList.add("prettyprint"),e.parentNode.insertBefore(n,e),n.appendChild(e))})}function highlightAndBringLineIntoView(){var e=window.location.hash.replace("#line","");try{var t='[data-line-number="'+e+'"',o=document.querySelector(t);o.scrollIntoView(),o.parentNode.classList.add("selected")}catch(e){console.error(e)}}function getFontSize(){var e=16;try{e=Number.parseInt(html.style.fontSize.split("px")[0],10)}catch(e){console.log(e)}return e}function localUpdateFontSize(e){html.style.fontSize=e+"px";var t=document.querySelector("#b77a68a492f343baabea06fad81f651e");t&&(t.innerHTML=e)}function updateFontSize(e){localUpdateFontSize(e),localStorage.setItem(fontSizeLocalStorageKey,e)}function incrementFont(e){var t=getFontSize();t + +
      + ${e} +
      + + + + + `}function initTooltip(){tippy(".theme-toggle",{content:"Toggle Theme",delay:500}),tippy(".search-button",{content:"Search",delay:500}),tippy(".font-size",{content:"Change font size",delay:500}),tippy(".codepen-button",{content:"Open code in CodePen",placement:"left"}),tippy(".copy-code",{content:"Copy this code",placement:"left"}),tippy(".font-size",{content:fontSizeTooltip(),trigger:"click",interactive:!0,allowHTML:!0,placement:"left"})}function fixTable(){for(const t of document.querySelectorAll("table")){if(t.classList.contains("hljs-ln"))return;var e=document.createElement("div");e.classList.add("table-div"),t.parentNode.insertBefore(e,t),e.appendChild(t)}}function hideMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.remove("show"),t&&t.setAttribute("data-isopen","false"),o&&o.setAttribute("xlink:href","#menu-icon")}function showMobileMenu(){var e=document.querySelector("#mobile-sidebar"),t=document.querySelector("#mobile-menu"),o=t.querySelector("use");e&&e.classList.add("show"),t&&t.setAttribute("data-isopen","true"),o&&o.setAttribute("xlink:href","#close-icon")}function onMobileMenuClick(){("true"===document.querySelector("#mobile-menu").getAttribute("data-isopen")?hideMobileMenu:showMobileMenu)()}function initMobileMenu(){var e=document.querySelector("#mobile-menu");e&&e.addEventListener("click",onMobileMenuClick)}function addHrefToSidebarTitle(){document.querySelectorAll(".sidebar-title-anchor").forEach(function(e){e.setAttribute("href",baseURL)})}function onDomContentLoaded(){var e=document.querySelectorAll(".theme-toggle");initMobileMenu(),e&&e.forEach(function(e){e.addEventListener("click",toggleTheme)}),hljs.addPlugin({"after:highlightElement":function(e){e.el.parentNode.setAttribute("data-lang","code")}}),hljs.highlightAll(),hljs.initLineNumbersOnLoad({singleLine:!0}),initAccordion(),addAnchor(),processAllPre(),hideTocOnSourcePage(),setTimeout(function(){bringIdToViewOnMount(),isSourcePage()&&highlightAndBringLineIntoView()},1e3),initTooltip(),fixTable(),addHrefToSidebarTitle()}updateTheme(getTheme()),function(){var e=getFontSize(),t=localStorage.getItem(fontSizeLocalStorageKey);t?(t=Number.parseInt(t,10))!==e&&updateFontSize(t):updateFontSize(e)}(),window.addEventListener("DOMContentLoaded",onDomContentLoaded),window.addEventListener("hashchange",e=>{e=new URL(e.newURL);""!==e.hash&&bringIdToViewOnMount(e.hash)}),window.addEventListener("storage",e=>{"undefined"!==e.newValue&&(initTooltip(),e.key===themeLocalStorageKey&&localUpdateTheme(e.newValue),e.key===fontSizeLocalStorageKey&&localUpdateFontSize(e.newValue))}); \ No newline at end of file diff --git a/scripts/linenumber.js b/scripts/linenumber.js new file mode 100644 index 0000000..1ba4057 --- /dev/null +++ b/scripts/linenumber.js @@ -0,0 +1,26 @@ +/*global document */ + +(function() { + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + var lineId; + var lines; + var totalLines; + var anchorHash; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = 'line' + lineNumber; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/scripts/resize.js b/scripts/resize.js new file mode 100644 index 0000000..2c3367d --- /dev/null +++ b/scripts/resize.js @@ -0,0 +1,90 @@ +/* global document */ +// This file is @deprecated + +var NAVBAR_OPTIONS = {}; + +(function() { + var NAVBAR_RESIZE_LOCAL_STORAGE_KEY = 'NAVBAR_RESIZE_LOCAL_STORAGE_KEY'; + + var navbar = document.querySelector('#navbar'); + var footer = document.querySelector('#footer'); + var mainSection = document.querySelector('#main'); + var localStorageResizeObject = JSON.parse( + // eslint-disable-next-line no-undef + localStorage.getItem(NAVBAR_RESIZE_LOCAL_STORAGE_KEY) + ); + + /** + * Check whether we have any resize value in local storage or not. + * If we have resize value then resize the navbar. + **/ + if (localStorageResizeObject) { + navbar.style.width = localStorageResizeObject.width; + mainSection.style.marginLeft = localStorageResizeObject.width; + footer.style.marginLeft = localStorageResizeObject.width; + } + + var navbarSlider = document.querySelector('#navbar-resize'); + + function resizeNavbar(event) { + var pageX = event.pageX, + pageXPlusPx = event.pageX + 'px', + min = Number.parseInt(NAVBAR_OPTIONS.min, 10) || 300, + max = Number.parseInt(NAVBAR_OPTIONS.max, 10) || 600; + + /** + * Just to add some checks. If min is smaller than 10 then + * user may accidentally end up reducing the size of navbar + * less than 10. In that case user will not able to resize navbar + * because navbar slider will be hidden. + */ + if (min < 10) { + min = 10; + } + + /** + * Only resize if pageX in range between min and max + * allowed value. + */ + if (min < pageX && pageX < max) { + navbar.style.width = pageXPlusPx; + mainSection.style.marginLeft = pageXPlusPx; + footer.style.marginLeft = pageXPlusPx; + } + } + + function setupEventListeners() { + // eslint-disable-next-line no-undef + window.addEventListener('mousemove', resizeNavbar); + // eslint-disable-next-line no-undef + window.addEventListener('touchmove', resizeNavbar); + } + + function afterRemovingEventListeners() { + // eslint-disable-next-line no-undef + localStorage.setItem( + NAVBAR_RESIZE_LOCAL_STORAGE_KEY, + JSON.stringify({ + width: navbar.style.width + }) + ); + } + + function removeEventListeners() { + // eslint-disable-next-line no-undef + window.removeEventListener('mousemove', resizeNavbar); + // eslint-disable-next-line no-undef + window.removeEventListener('touchend', resizeNavbar); + afterRemovingEventListeners(); + } + + navbarSlider.addEventListener('mousedown', setupEventListeners); + navbarSlider.addEventListener('touchstart', setupEventListeners); + // eslint-disable-next-line no-undef + window.addEventListener('mouseup', removeEventListeners); +})(); + +// eslint-disable-next-line no-unused-vars +function setupResizeOptions(options) { + NAVBAR_OPTIONS = options; +} diff --git a/scripts/search.js b/scripts/search.js new file mode 100644 index 0000000..30836a4 --- /dev/null +++ b/scripts/search.js @@ -0,0 +1,265 @@ +/* global document */ + +const searchId = 'LiBfqbJVcV'; +const searchHash = '#' + searchId; +const searchContainer = document.querySelector('#PkfLWpAbet'); +const searchWrapper = document.querySelector('#iCxFxjkHbP'); +const searchCloseButton = document.querySelector('#VjLlGakifb'); +const searchInput = document.querySelector('#vpcKVYIppa'); +const resultBox = document.querySelector('#fWwVHRuDuN'); + +function showResultText(text) { + resultBox.innerHTML = `${text}`; +} + +function hideSearch() { + // eslint-disable-next-line no-undef + if (window.location.hash === searchHash) { + // eslint-disable-next-line no-undef + history.go(-1); + } + + // eslint-disable-next-line no-undef + window.onhashchange = null; + + if (searchContainer) { + searchContainer.style.display = 'none'; + } +} + +function listenCloseKey(event) { + if (event.key === 'Escape') { + hideSearch(); + // eslint-disable-next-line no-undef + window.removeEventListener('keyup', listenCloseKey); + } +} + +function showSearch() { + try { + // Closing mobile menu before opening + // search box. + // It is defined in core.js + // eslint-disable-next-line no-undef + hideMobileMenu(); + } catch (error) { + console.error(error); + } + + // eslint-disable-next-line no-undef + window.onhashchange = hideSearch; + + // eslint-disable-next-line no-undef + if (window.location.hash !== searchHash) { + // eslint-disable-next-line no-undef + history.pushState(null, null, searchHash); + } + + if (searchContainer) { + searchContainer.style.display = 'flex'; + // eslint-disable-next-line no-undef + window.addEventListener('keyup', listenCloseKey); + } + + if (searchInput) { + searchInput.focus(); + } +} + +async function fetchAllData() { + // eslint-disable-next-line no-undef + const { hostname, protocol, port } = location; + + // eslint-disable-next-line no-undef + const base = protocol + '//' + hostname + (port !== '' ? ':' + port : '') + baseURL; + // eslint-disable-next-line no-undef + const url = new URL('data/search.json', base); + const result = await fetch(url); + const { list } = await result.json(); + + return list; +} + +// eslint-disable-next-line no-unused-vars +function onClickSearchItem(event) { + const target = event.currentTarget; + + if (target) { + const href = target.getAttribute('href') || ''; + let elementId = href.split('#')[1] || ''; + let element = document.getElementById(elementId); + + if (!element) { + elementId = decodeURI(elementId); + element = document.getElementById(elementId); + } + + if (element) { + setTimeout(function() { + // eslint-disable-next-line no-undef + bringElementIntoView(element); // defined in core.js + }, 100); + } + } +} + +function buildSearchResult(result) { + let output = ''; + const removeHTMLTagsRegExp = /(<([^>]+)>)/ig; + + for (const res of result) { + const { title = '', description = '' } = res.item; + + const _link = res.item.link.replace('
      .*/, ''); + const _title = title.replace(removeHTMLTagsRegExp, ""); + const _description = description.replace(removeHTMLTagsRegExp, ""); + + output += ` + +
      ${_title}
      +
      ${_description || 'No description available.'}
      +
      + `; + } + + return output; +} + +function getSearchResult(list, keys, searchKey) { + const defaultOptions = { + shouldSort: true, + threshold: 0.4, + location: 0, + distance: 100, + maxPatternLength: 32, + minMatchCharLength: 1, + keys: keys + }; + + const options = { ...defaultOptions }; + + // eslint-disable-next-line no-undef + const searchIndex = Fuse.createIndex(options.keys, list); + + // eslint-disable-next-line no-undef + const fuse = new Fuse(list, options, searchIndex); + + const result = fuse.search(searchKey); + + if (result.length > 20) { + return result.slice(0, 20); + } + + return result; +} + +function debounce(func, wait, immediate) { + let timeout; + + return function() { + const args = arguments; + + clearTimeout(timeout); + timeout = setTimeout(() => { + timeout = null; + if (!immediate) { + // eslint-disable-next-line consistent-this, no-invalid-this + func.apply(this, args); + } + }, wait); + + if (immediate && !timeout) { + // eslint-disable-next-line consistent-this, no-invalid-this + func.apply(this, args); + } + }; +} + +let searchData; + +async function search(event) { + const value = event.target.value; + const keys = ['title', 'description']; + + if (!resultBox) { + console.error('Search result container not found'); + + return; + } + + if (!value) { + showResultText('Type anything to view search result'); + + return; + } + + if (!searchData) { + showResultText('Loading...'); + + try { + // eslint-disable-next-line require-atomic-updates + searchData = await fetchAllData(); + } catch (e) { + console.log(e); + showResultText('Failed to load result.'); + + return; + } + } + + const result = getSearchResult(searchData, keys, value); + + if (!result.length) { + showResultText('No result found! Try some different combination.'); + + return; + } + + // eslint-disable-next-line require-atomic-updates + resultBox.innerHTML = buildSearchResult(result); +} + +function onDomContentLoaded() { + const searchButton = document.querySelectorAll('.search-button'); + const debouncedSearch = debounce(search, 300); + + if (searchCloseButton) { + searchCloseButton.addEventListener('click', hideSearch); + } + + if (searchButton) { + searchButton.forEach(function(item) { + item.addEventListener('click', showSearch); + }); + } + + if (searchContainer) { + searchContainer.addEventListener('click', hideSearch); + } + + if (searchWrapper) { + searchWrapper.addEventListener('click', function(event) { + event.stopPropagation(); + }); + } + + if (searchInput) { + searchInput.addEventListener('keyup', debouncedSearch); + } + + // eslint-disable-next-line no-undef + if (window.location.hash === searchHash) { + showSearch(); + } +} + +// eslint-disable-next-line no-undef +window.addEventListener('DOMContentLoaded', onDomContentLoaded); + +// eslint-disable-next-line no-undef +window.addEventListener('hashchange', function() { + // eslint-disable-next-line no-undef + if (window.location.hash === searchHash) { + showSearch(); + } +}); diff --git a/scripts/search.min.js b/scripts/search.min.js new file mode 100644 index 0000000..5358bce --- /dev/null +++ b/scripts/search.min.js @@ -0,0 +1,6 @@ +const searchId="LiBfqbJVcV",searchHash="#"+searchId,searchContainer=document.querySelector("#PkfLWpAbet"),searchWrapper=document.querySelector("#iCxFxjkHbP"),searchCloseButton=document.querySelector("#VjLlGakifb"),searchInput=document.querySelector("#vpcKVYIppa"),resultBox=document.querySelector("#fWwVHRuDuN");function showResultText(e){resultBox.innerHTML=`${e}`}function hideSearch(){window.location.hash===searchHash&&history.go(-1),window.onhashchange=null,searchContainer&&(searchContainer.style.display="none")}function listenCloseKey(e){"Escape"===e.key&&(hideSearch(),window.removeEventListener("keyup",listenCloseKey))}function showSearch(){try{hideMobileMenu()}catch(e){console.error(e)}window.onhashchange=hideSearch,window.location.hash!==searchHash&&history.pushState(null,null,searchHash),searchContainer&&(searchContainer.style.display="flex",window.addEventListener("keyup",listenCloseKey)),searchInput&&searchInput.focus()}async function fetchAllData(){var{hostname:e,protocol:t,port:n}=location,t=t+"//"+e+(""!==n?":"+n:"")+baseURL,e=new URL("data/search.json",t);const a=await fetch(e);n=(await a.json()).list;return n}function onClickSearchItem(t){const n=t.currentTarget;if(n){const a=n.getAttribute("href")||"";t=a.split("#")[1]||"";let e=document.getElementById(t);e||(t=decodeURI(t),e=document.getElementById(t)),e&&setTimeout(function(){bringElementIntoView(e)},100)}}function buildSearchResult(e){let t="";var n=/(<([^>]+)>)/gi;for(const s of e){const{title:c="",description:i=""}=s.item;var a=s.item.link.replace('.*/,""),o=c.replace(n,""),r=i.replace(n,"");t+=` + +
      ${o}
      +
      ${r||"No description available."}
      +
      + `}return t}function getSearchResult(e,t,n){var t={...{shouldSort:!0,threshold:.4,location:0,distance:100,maxPatternLength:32,minMatchCharLength:1,keys:t}},a=Fuse.createIndex(t.keys,e);const o=new Fuse(e,t,a),r=o.search(n);return 20{o=null,a||t.apply(this,e)},n),a&&!o&&t.apply(this,e)}}let searchData;async function search(e){e=e.target.value;if(resultBox)if(e){if(!searchData){showResultText("Loading...");try{searchData=await fetchAllData()}catch(e){return console.log(e),void showResultText("Failed to load result.")}}e=getSearchResult(searchData,["title","description"],e);e.length?resultBox.innerHTML=buildSearchResult(e):showResultText("No result found! Try some different combination.")}else showResultText("Type anything to view search result");else console.error("Search result container not found")}function onDomContentLoaded(){const e=document.querySelectorAll(".search-button");var t=debounce(search,300);searchCloseButton&&searchCloseButton.addEventListener("click",hideSearch),e&&e.forEach(function(e){e.addEventListener("click",showSearch)}),searchContainer&&searchContainer.addEventListener("click",hideSearch),searchWrapper&&searchWrapper.addEventListener("click",function(e){e.stopPropagation()}),searchInput&&searchInput.addEventListener("keyup",t),window.location.hash===searchHash&&showSearch()}window.addEventListener("DOMContentLoaded",onDomContentLoaded),window.addEventListener("hashchange",function(){window.location.hash===searchHash&&showSearch()}); \ No newline at end of file diff --git a/scripts/third-party/Apache-License-2.0.txt b/scripts/third-party/Apache-License-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/scripts/third-party/Apache-License-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/scripts/third-party/fuse.js b/scripts/third-party/fuse.js new file mode 100644 index 0000000..7def598 --- /dev/null +++ b/scripts/third-party/fuse.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.4.6 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2021 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:3,t=new Map,n=Math.pow(10,e);return{get:function(e){var r=e.match(I).length;if(t.has(r))return t.get(r);var i=1/Math.sqrt(r),o=parseFloat(Math.round(i*n)/n);return t.set(r,o),o},clear:function(){t.clear()}}}var E=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?A.getFn:r;t(this,e),this.norm=C(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return r(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?A.getFn:r,o=new E({getFn:i});return o.setKeys(e.map(_)),o.setSources(t),o.create(),o}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?A.distance:s,h=t.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r/e.length;if(f)return l;var d=Math.abs(a-o);return u?l+d/u:d?1:l}function F(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:A.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function P(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?A.location:o,a=i.threshold,s=void 0===a?A.threshold:a,u=i.distance,h=void 0===u?A.distance:u,f=i.includeMatches,l=void 0===f?A.includeMatches:f,d=i.findAllMatches,v=void 0===d?A.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?A.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?A.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?A.ignoreLocation:k;if(t(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:l,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){r.chunks.push({pattern:e,alphabet:P(e),startIndex:t})},x=this.pattern.length;if(x>32){for(var L=0,S=x%32,w=x-S;L3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?A.location:i,c=r.distance,a=void 0===c?A.distance:c,s=r.threshold,u=void 0===s?A.threshold:s,h=r.findAllMatches,f=void 0===h?A.findAllMatches:h,l=r.minMatchCharLength,d=void 0===l?A.minMatchCharLength:l,v=r.includeMatches,g=void 0===v?A.includeMatches:v,y=r.ignoreLocation,p=void 0===y?A.ignoreLocation:y;if(t.length>32)throw new Error(L(32));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,S=b,w=d>1||g,_=w?Array(M):[];(m=e.indexOf(t,S))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),S=m+k,w)for(var j=0;j=K;J-=1){var T=J-1,U=n[e.charAt(T)];if(w&&(_[T]=+!!U),W[J]=(W[J+1]<<1|1)&U,P&&(W[J]|=(I[J+1]|I[J])<<1|1|I[J+1]),W[J]&$&&(C=R(t,{errors:P,currentLocation:T,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(S=T)<=b)break;K=Math.max(1,2*b-S)}}var V=R(t,{errors:P+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p});if(V>x)break;I=W}var B={isMatch:S>=0,score:Math.max(.001,C)};if(w){var G=F(_,d);G.length?g&&(B.indices=G):B.isMatch=!1}return B}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:f}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(l(d),l(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),D=function(){function e(n){t(this,e),this.pattern=n}return r(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return z(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return z(e,this.singleRegex)}}]),e}();function z(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),i}(D),q=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),i}(D),W=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),i}(D),J=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),i}(D),T=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),i}(D),U=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),i}(D),V=function(e){a(i,e);var n=f(i);function i(e){var r,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?A.location:c,s=o.threshold,u=void 0===s?A.threshold:s,h=o.distance,f=void 0===h?A.distance:h,l=o.includeMatches,d=void 0===l?A.includeMatches:l,v=o.findAllMatches,g=void 0===v?A.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?A.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?A.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?A.ignoreLocation:M;return t(this,i),(r=n.call(this,e))._bitapSearch=new N(e,{location:a,threshold:u,distance:f,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),r}return r(i,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),i}(D),B=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),i}(D),G=[K,B,W,J,U,T,q,V],H=G.length,Q=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/;function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Q).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=r.isCaseSensitive,o=void 0===i?A.isCaseSensitive:i,c=r.includeMatches,a=void 0===c?A.includeMatches:c,s=r.minMatchCharLength,u=void 0===s?A.minMatchCharLength:s,h=r.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r.findAllMatches,d=void 0===l?A.findAllMatches:l,v=r.location,g=void 0===v?A.location:v,y=r.threshold,p=void 0===y?A.threshold:y,m=r.distance,k=void 0===m?A.distance:m;t(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:f,location:g,threshold:p,distance:k},this.pattern=o?n:n.toLowerCase(),this.query=X(this.pattern,this.options)}return r(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function le(e,t){t.score=e.score}function de(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?A.includeMatches:r,o=n.includeScore,c=void 0===o?A.includeScore:o,a=[];return i&&a.push(fe),c&&a.push(le),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ve=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;t(this,e),this.options=c({},A,{},r),this.options.useExtendedSearch,this._keyStore=new w(this.options.keys),this.setCollection(n,i)}return r(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||$(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return he(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),de(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=te(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.auto,i=void 0===r||r,o=function e(n){var r=Object.keys(n),o=ae(n);if(!o&&r.length>1&&!ce(n))return e(ue(n));if(se(n)){var c=o?n[ie]:r[0],a=o?n[oe]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return i&&(s.searcher=te(a,t)),s}var u={children:[],operator:r[0]};return r.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return ce(e)||(e=ue(e)),o(e)}(e,this.options),r=this._myIndex.records,i={},o=[];return r.forEach((function(e){var r=e.$,c=e.i;if(k(r)){var a=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}switch(n.operator){case ne:for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?A.getFn:n,i=e.keys,o=e.records,c=new E({getFn:r});return c.setKeys(i),c.setIndexRecords(o),c},ve.config=A,function(){ee.push.apply(ee,arguments)}(Z),ve},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t(); \ No newline at end of file diff --git a/scripts/third-party/hljs-line-num-original.js b/scripts/third-party/hljs-line-num-original.js new file mode 100644 index 0000000..cd1cd5f --- /dev/null +++ b/scripts/third-party/hljs-line-num-original.js @@ -0,0 +1,369 @@ +// jshint multistr:true + +(function (w, d) { + 'use strict'; + + var TABLE_NAME = 'hljs-ln', + LINE_NAME = 'hljs-ln-line', + CODE_BLOCK_NAME = 'hljs-ln-code', + NUMBERS_BLOCK_NAME = 'hljs-ln-numbers', + NUMBER_LINE_NAME = 'hljs-ln-n', + DATA_ATTR_NAME = 'data-line-number', + BREAK_LINE_REGEXP = /\r\n|\r|\n/g; + + if (w.hljs) { + w.hljs.initLineNumbersOnLoad = initLineNumbersOnLoad; + w.hljs.lineNumbersBlock = lineNumbersBlock; + w.hljs.lineNumbersValue = lineNumbersValue; + + addStyles(); + } else { + w.console.error('highlight.js not detected!'); + } + + function isHljsLnCodeDescendant(domElt) { + var curElt = domElt; + while (curElt) { + if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) { + return true; + } + curElt = curElt.parentNode; + } + return false; + } + + function getHljsLnTable(hljsLnDomElt) { + var curElt = hljsLnDomElt; + while (curElt.nodeName !== 'TABLE') { + curElt = curElt.parentNode; + } + return curElt; + } + + // Function to workaround a copy issue with Microsoft Edge. + // Due to hljs-ln wrapping the lines of code inside a element, + // itself wrapped inside a
       element, window.getSelection().toString()
      +    // does not contain any line breaks. So we need to get them back using the
      +    // rendered code in the DOM as reference.
      +    function edgeGetSelectedCodeLines(selection) {
      +        // current selected text without line breaks
      +        var selectionText = selection.toString();
      +
      +        // get the 
      ' + + '' + + '' + + '', + [ + LINE_NAME, + NUMBERS_BLOCK_NAME, + NUMBER_LINE_NAME, + DATA_ATTR_NAME, + CODE_BLOCK_NAME, + i + options.startFrom, + lines[i].length > 0 ? lines[i] : ' ' + ]); + } + + return format('
      element wrapping the first line of selected code + var tdAnchor = selection.anchorNode; + while (tdAnchor.nodeName !== 'TD') { + tdAnchor = tdAnchor.parentNode; + } + + // get the element wrapping the last line of selected code + var tdFocus = selection.focusNode; + while (tdFocus.nodeName !== 'TD') { + tdFocus = tdFocus.parentNode; + } + + // extract line numbers + var firstLineNumber = parseInt(tdAnchor.dataset.lineNumber); + var lastLineNumber = parseInt(tdFocus.dataset.lineNumber); + + // multi-lines copied case + if (firstLineNumber != lastLineNumber) { + + var firstLineText = tdAnchor.textContent; + var lastLineText = tdFocus.textContent; + + // if the selection was made backward, swap values + if (firstLineNumber > lastLineNumber) { + var tmp = firstLineNumber; + firstLineNumber = lastLineNumber; + lastLineNumber = tmp; + tmp = firstLineText; + firstLineText = lastLineText; + lastLineText = tmp; + } + + // discard not copied characters in first line + while (selectionText.indexOf(firstLineText) !== 0) { + firstLineText = firstLineText.slice(1); + } + + // discard not copied characters in last line + while (selectionText.lastIndexOf(lastLineText) === -1) { + lastLineText = lastLineText.slice(0, -1); + } + + // reconstruct and return the real copied text + var selectedText = firstLineText; + var hljsLnTable = getHljsLnTable(tdAnchor); + for (var i = firstLineNumber + 1 ; i < lastLineNumber ; ++i) { + var codeLineSel = format('.{0}[{1}="{2}"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]); + var codeLineElt = hljsLnTable.querySelector(codeLineSel); + selectedText += '\n' + codeLineElt.textContent; + } + selectedText += '\n' + lastLineText; + return selectedText; + // single copied line case + } else { + return selectionText; + } + } + + // ensure consistent code copy/paste behavior across all browsers + // (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51) + document.addEventListener('copy', function(e) { + // get current selection + var selection = window.getSelection(); + // override behavior when one wants to copy line of codes + if (isHljsLnCodeDescendant(selection.anchorNode)) { + var selectionText; + // workaround an issue with Microsoft Edge as copied line breaks + // are removed otherwise from the selection string + if (window.navigator.userAgent.indexOf('Edge') !== -1) { + selectionText = edgeGetSelectedCodeLines(selection); + } else { + // other browsers can directly use the selection string + selectionText = selection.toString(); + } + e.clipboardData.setData( + 'text/plain', + selectionText + .replace(/(^\t)/gm, '') + ); + e.preventDefault(); + } + }); + + function addStyles () { + var css = d.createElement('style'); + css.type = 'text/css'; + css.innerHTML = format( + '.{0}{border-collapse:collapse}' + + '.{0} td{padding:0}' + + '.{1}:before{content:attr({2})}', + [ + TABLE_NAME, + NUMBER_LINE_NAME, + DATA_ATTR_NAME + ]); + d.getElementsByTagName('head')[0].appendChild(css); + } + + function initLineNumbersOnLoad (options) { + if (d.readyState === 'interactive' || d.readyState === 'complete') { + documentReady(options); + } else { + w.addEventListener('DOMContentLoaded', function () { + documentReady(options); + }); + } + } + + function documentReady (options) { + try { + var blocks = d.querySelectorAll('code.hljs,code.nohighlight'); + + for (var i in blocks) { + if (blocks.hasOwnProperty(i)) { + if (!isPluginDisabledForBlock(blocks[i])) { + lineNumbersBlock(blocks[i], options); + } + } + } + } catch (e) { + w.console.error('LineNumbers error: ', e); + } + } + + function isPluginDisabledForBlock(element) { + return element.classList.contains('nohljsln'); + } + + function lineNumbersBlock (element, options) { + if (typeof element !== 'object') return; + + async(function () { + element.innerHTML = lineNumbersInternal(element, options); + }); + } + + function lineNumbersValue (value, options) { + if (typeof value !== 'string') return; + + var element = document.createElement('code') + element.innerHTML = value + + return lineNumbersInternal(element, options); + } + + function lineNumbersInternal (element, options) { + + var internalOptions = mapOptions(element, options); + + duplicateMultilineNodes(element); + + return addLineNumbersBlockFor(element.innerHTML, internalOptions); + } + + function addLineNumbersBlockFor (inputHtml, options) { + var lines = getLines(inputHtml); + + // if last line contains only carriage return remove it + if (lines[lines.length-1].trim() === '') { + lines.pop(); + } + + if (lines.length > 1 || options.singleLine) { + var html = ''; + + for (var i = 0, l = lines.length; i < l; i++) { + html += format( + '
      ' + + '' + + '{6}' + + '
      {1}
      ', [ TABLE_NAME, html ]); + } + + return inputHtml; + } + + /** + * @param {HTMLElement} element Code block. + * @param {Object} options External API options. + * @returns {Object} Internal API options. + */ + function mapOptions (element, options) { + options = options || {}; + return { + singleLine: getSingleLineOption(options), + startFrom: getStartFromOption(element, options) + }; + } + + function getSingleLineOption (options) { + var defaultValue = false; + if (!!options.singleLine) { + return options.singleLine; + } + return defaultValue; + } + + function getStartFromOption (element, options) { + var defaultValue = 1; + var startFrom = defaultValue; + + if (isFinite(options.startFrom)) { + startFrom = options.startFrom; + } + + // can be overridden because local option is priority + var value = getAttribute(element, 'data-ln-start-from'); + if (value !== null) { + startFrom = toNumber(value, defaultValue); + } + + return startFrom; + } + + /** + * Recursive method for fix multi-line elements implementation in highlight.js + * Doing deep passage on child nodes. + * @param {HTMLElement} element + */ + function duplicateMultilineNodes (element) { + var nodes = element.childNodes; + for (var node in nodes) { + if (nodes.hasOwnProperty(node)) { + var child = nodes[node]; + if (getLinesCount(child.textContent) > 0) { + if (child.childNodes.length > 0) { + duplicateMultilineNodes(child); + } else { + duplicateMultilineNode(child.parentNode); + } + } + } + } + } + + /** + * Method for fix multi-line elements implementation in highlight.js + * @param {HTMLElement} element + */ + function duplicateMultilineNode (element) { + var className = element.className; + + if ( ! /hljs-/.test(className)) return; + + var lines = getLines(element.innerHTML); + + for (var i = 0, result = ''; i < lines.length; i++) { + var lineText = lines[i].length > 0 ? lines[i] : ' '; + result += format('{1}\n', [ className, lineText ]); + } + + element.innerHTML = result.trim(); + } + + function getLines (text) { + if (text.length === 0) return []; + return text.split(BREAK_LINE_REGEXP); + } + + function getLinesCount (text) { + return (text.trim().match(BREAK_LINE_REGEXP) || []).length; + } + + /// + /// HELPERS + /// + + function async (func) { + w.setTimeout(func, 0); + } + + /** + * {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript} + * @param {string} format + * @param {array} args + */ + function format (format, args) { + return format.replace(/\{(\d+)\}/g, function(m, n){ + return args[n] !== undefined ? args[n] : m; + }); + } + + /** + * @param {HTMLElement} element Code block. + * @param {String} attrName Attribute name. + * @returns {String} Attribute value or empty. + */ + function getAttribute (element, attrName) { + return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null; + } + + /** + * @param {String} str Source string. + * @param {Number} fallback Fallback value. + * @returns Parsed number or fallback value. + */ + function toNumber (str, fallback) { + if (!str) return fallback; + var number = Number(str); + return isFinite(number) ? number : fallback; + } + +}(window, document)); diff --git a/scripts/third-party/hljs-line-num.js b/scripts/third-party/hljs-line-num.js new file mode 100644 index 0000000..facdf6b --- /dev/null +++ b/scripts/third-party/hljs-line-num.js @@ -0,0 +1 @@ +!function(r,o){"use strict";var e,l="hljs-ln",s="hljs-ln-line",f="hljs-ln-code",c="hljs-ln-numbers",u="hljs-ln-n",h="data-line-number",n=/\r\n|\r|\n/g;function t(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var e=parseInt(t.dataset.lineNumber),o=parseInt(r.dataset.lineNumber);if(e==o)return n;var a,i=t.textContent,l=r.textContent;for(o{6}',[s,c,u,h,f,a+t.startFrom,0{1}',[l,o])}return e}function m(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r{1}\n',[n,0/g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + /** + * performs a shallow merge of multiple objects into one + * + * @template T + * @param {T} original + * @param {Record[]} objects + * @returns {T} a single new object + */ + function inherit$1(original, ...objects) { + /** @type Record */ + const result = Object.create(null); + + for (const key in original) { + result[key] = original[key]; + } + objects.forEach(function (obj) { + for (const key in obj) { + result[key] = obj[key]; + } + }); + return /** @type {T} */ (result); + } + + /** + * @typedef {object} Renderer + * @property {(text: string) => void} addText + * @property {(node: Node) => void} openNode + * @property {(node: Node) => void} closeNode + * @property {() => string} value + */ + + /** @typedef {{kind?: string, sublanguage?: boolean}} Node */ + /** @typedef {{walk: (r: Renderer) => void}} Tree */ + /** */ + + const SPAN_CLOSE = ''; + + /** + * Determines if a node needs to be wrapped in + * + * @param {Node} node */ + const emitsWrappingTags = (node) => { + return !!node.kind; + }; + + /** + * + * @param {string} name + * @param {{prefix:string}} options + */ + const expandScopeName = (name, { prefix }) => { + if (name.includes(".")) { + const pieces = name.split("."); + return [ + `${prefix}${pieces.shift()}`, + ...(pieces.map((x, i) => `${x}${"_".repeat(i + 1)}`)) + ].join(" "); + } + return `${prefix}${name}`; + }; + + /** @type {Renderer} */ + class HTMLRenderer { + /** + * Creates a new HTMLRenderer + * + * @param {Tree} parseTree - the parse tree (must support `walk` API) + * @param {{classPrefix: string}} options + */ + constructor(parseTree, options) { + this.buffer = ""; + this.classPrefix = options.classPrefix; + parseTree.walk(this); + } + + /** + * Adds texts to the output stream + * + * @param {string} text */ + addText(text) { + this.buffer += escapeHTML(text); + } + + /** + * Adds a node open to the output stream (if needed) + * + * @param {Node} node */ + openNode(node) { + if (!emitsWrappingTags(node)) return; + + let scope = node.kind; + if (node.sublanguage) { + scope = `language-${scope}`; + } else { + scope = expandScopeName(scope, { prefix: this.classPrefix }); + } + this.span(scope); + } + + /** + * Adds a node close to the output stream (if needed) + * + * @param {Node} node */ + closeNode(node) { + if (!emitsWrappingTags(node)) return; + + this.buffer += SPAN_CLOSE; + } + + /** + * returns the accumulated buffer + */ + value() { + return this.buffer; + } + + // helpers + + /** + * Builds a span element + * + * @param {string} className */ + span(className) { + this.buffer += ``; + } + } + + /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} | string} Node */ + /** @typedef {{kind?: string, sublanguage?: boolean, children: Node[]} } DataNode */ + /** @typedef {import('highlight.js').Emitter} Emitter */ + /** */ + + class TokenTree { + constructor() { + /** @type DataNode */ + this.rootNode = { children: [] }; + this.stack = [this.rootNode]; + } + + get top() { + return this.stack[this.stack.length - 1]; + } + + get root() { return this.rootNode; } + + /** @param {Node} node */ + add(node) { + this.top.children.push(node); + } + + /** @param {string} kind */ + openNode(kind) { + /** @type Node */ + const node = { kind, children: [] }; + this.add(node); + this.stack.push(node); + } + + closeNode() { + if (this.stack.length > 1) { + return this.stack.pop(); + } + // eslint-disable-next-line no-undefined + return undefined; + } + + closeAllNodes() { + while (this.closeNode()); + } + + toJSON() { + return JSON.stringify(this.rootNode, null, 4); + } + + /** + * @typedef { import("./html_renderer").Renderer } Renderer + * @param {Renderer} builder + */ + walk(builder) { + // this does not + return this.constructor._walk(builder, this.rootNode); + // this works + // return TokenTree._walk(builder, this.rootNode); + } + + /** + * @param {Renderer} builder + * @param {Node} node + */ + static _walk(builder, node) { + if (typeof node === "string") { + builder.addText(node); + } else if (node.children) { + builder.openNode(node); + node.children.forEach((child) => this._walk(builder, child)); + builder.closeNode(node); + } + return builder; + } + + /** + * @param {Node} node + */ + static _collapse(node) { + if (typeof node === "string") return; + if (!node.children) return; + + if (node.children.every(el => typeof el === "string")) { + // node.text = node.children.join(""); + // delete node.children; + node.children = [node.children.join("")]; + } else { + node.children.forEach((child) => { + TokenTree._collapse(child); + }); + } + } + } + + /** + Currently this is all private API, but this is the minimal API necessary + that an Emitter must implement to fully support the parser. + + Minimal interface: + + - addKeyword(text, kind) + - addText(text) + - addSublanguage(emitter, subLanguageName) + - finalize() + - openNode(kind) + - closeNode() + - closeAllNodes() + - toHTML() + + */ + + /** + * @implements {Emitter} + */ + class TokenTreeEmitter extends TokenTree { + /** + * @param {*} options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {string} text + * @param {string} kind + */ + addKeyword(text, kind) { + if (text === "") { return; } + + this.openNode(kind); + this.addText(text); + this.closeNode(); + } + + /** + * @param {string} text + */ + addText(text) { + if (text === "") { return; } + + this.add(text); + } + + /** + * @param {Emitter & {root: DataNode}} emitter + * @param {string} name + */ + addSublanguage(emitter, name) { + /** @type DataNode */ + const node = emitter.root; + node.kind = name; + node.sublanguage = true; + this.add(node); + } + + toHTML() { + const renderer = new HTMLRenderer(this, this.options); + return renderer.value(); + } + + finalize() { + return true; + } + } + + /** + * @param {string} value + * @returns {RegExp} + * */ + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function source(re) { + if (!re) return null; + if (typeof re === "string") return re; + + return re.source; + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function lookahead(re) { + return concat('(?=', re, ')'); + } + + /** + * @param {RegExp | string } re + * @returns {string} + */ + function optional(re) { + return concat('(?:', re, ')?'); + } + + /** + * @param {...(RegExp | string) } args + * @returns {string} + */ + function concat(...args) { + const joined = args.map((x) => source(x)).join(""); + return joined; + } + + function stripOptionsFromArgs(args) { + const opts = args[args.length - 1]; + + if (typeof opts === 'object' && opts.constructor === Object) { + args.splice(args.length - 1, 1); + return opts; + } else { + return {}; + } + } + + /** + * Any of the passed expresssions may match + * + * Creates a huge this | this | that | that match + * @param {(RegExp | string)[] } args + * @returns {string} + */ + function either(...args) { + const opts = stripOptionsFromArgs(args); + const joined = '(' + + (opts.capture ? "" : "?:") + + args.map((x) => source(x)).join("|") + ")"; + return joined; + } + + /** + * @param {RegExp} re + * @returns {number} + */ + function countMatchGroups(re) { + return (new RegExp(re.toString() + '|')).exec('').length - 1; + } + + /** + * Does lexeme start with a regular expression match at the beginning + * @param {RegExp} re + * @param {string} lexeme + */ + function startsWith(re, lexeme) { + const match = re && re.exec(lexeme); + return match && match.index === 0; + } + + // BACKREF_RE matches an open parenthesis or backreference. To avoid + // an incorrect parse, it additionally matches the following: + // - [...] elements, where the meaning of parentheses and escapes change + // - other escape sequences, so we do not misparse escape sequences as + // interesting elements + // - non-matching or lookahead parentheses, which do not capture. These + // follow the '(' with a '?'. + const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + + // **INTERNAL** Not intended for outside usage + // join logically computes regexps.join(separator), but fixes the + // backreferences so they continue to match. + // it also places each individual regular expression into it's own + // match group, keeping track of the sequencing of those match groups + // is currently an exercise for the caller. :-) + /** + * @param {(string | RegExp)[]} regexps + * @param {{joinWith: string}} opts + * @returns {string} + */ + function _rewriteBackreferences(regexps, { joinWith }) { + let numCaptures = 0; + + return regexps.map((regex) => { + numCaptures += 1; + const offset = numCaptures; + let re = source(regex); + let out = ''; + + while (re.length > 0) { + const match = BACKREF_RE.exec(re); + if (!match) { + out += re; + break; + } + out += re.substring(0, match.index); + re = re.substring(match.index + match[0].length); + if (match[0][0] === '\\' && match[1]) { + // Adjust the backreference. + out += '\\' + String(Number(match[1]) + offset); + } else { + out += match[0]; + if (match[0] === '(') { + numCaptures++; + } + } + } + return out; + }).map(re => `(${re})`).join(joinWith); + } + + /** @typedef {import('highlight.js').Mode} Mode */ + /** @typedef {import('highlight.js').ModeCallback} ModeCallback */ + + // Common regexps + const MATCH_NOTHING_RE = /\b\B/; + const IDENT_RE$1 = '[a-zA-Z]\\w*'; + const UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*'; + const NUMBER_RE = '\\b\\d+(\\.\\d+)?'; + const C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float + const BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b... + const RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'; + + /** + * @param { Partial & {binary?: string | RegExp} } opts + */ + const SHEBANG = (opts = {}) => { + const beginShebang = /^#![ ]*\//; + if (opts.binary) { + opts.begin = concat( + beginShebang, + /.*\b/, + opts.binary, + /\b.*/); + } + return inherit$1({ + scope: 'meta', + begin: beginShebang, + end: /$/, + relevance: 0, + /** @type {ModeCallback} */ + "on:begin": (m, resp) => { + if (m.index !== 0) resp.ignoreMatch(); + } + }, opts); + }; + + // Common modes + const BACKSLASH_ESCAPE = { + begin: '\\\\[\\s\\S]', relevance: 0 + }; + const APOS_STRING_MODE = { + scope: 'string', + begin: '\'', + end: '\'', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] + }; + const QUOTE_STRING_MODE = { + scope: 'string', + begin: '"', + end: '"', + illegal: '\\n', + contains: [BACKSLASH_ESCAPE] + }; + const PHRASAL_WORDS_MODE = { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + }; + /** + * Creates a comment mode + * + * @param {string | RegExp} begin + * @param {string | RegExp} end + * @param {Mode | {}} [modeOptions] + * @returns {Partial} + */ + const COMMENT = function (begin, end, modeOptions = {}) { + const mode = inherit$1( + { + scope: 'comment', + begin, + end, + contains: [] + }, + modeOptions + ); + mode.contains.push({ + scope: 'doctag', + // hack to avoid the space from being included. the space is necessary to + // match here to prevent the plain text rule below from gobbling up doctags + begin: '[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)', + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: true, + relevance: 0 + }); + const ENGLISH_WORD = either( + // list of common 1 and 2 letter words in English + "I", + "a", + "is", + "so", + "us", + "to", + "at", + "if", + "in", + "it", + "on", + // note: this is not an exhaustive list of contractions, just popular ones + /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc + /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. + /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences + ); + // looking like plain text, more likely to be a comment + mode.contains.push( + { + // TODO: how to include ", (, ) without breaking grammars that use these for + // comment delimiters? + // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ + // --- + + // this tries to find sequences of 3 english words in a row (without any + // "programming" type syntax) this gives us a strong signal that we've + // TRULY found a comment - vs perhaps scanning with the wrong language. + // It's possible to find something that LOOKS like the start of the + // comment - but then if there is no readable text - good chance it is a + // false match and not a comment. + // + // for a visual example please see: + // https://github.com/highlightjs/highlight.js/issues/2827 + + begin: concat( + /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ + '(', + ENGLISH_WORD, + /[.]?[:]?([.][ ]|[ ])/, + '){3}') // look for 3 words in a row + } + ); + return mode; + }; + const C_LINE_COMMENT_MODE = COMMENT('//', '$'); + const C_BLOCK_COMMENT_MODE = COMMENT('/\\*', '\\*/'); + const HASH_COMMENT_MODE = COMMENT('#', '$'); + const NUMBER_MODE = { + scope: 'number', + begin: NUMBER_RE, + relevance: 0 + }; + const C_NUMBER_MODE = { + scope: 'number', + begin: C_NUMBER_RE, + relevance: 0 + }; + const BINARY_NUMBER_MODE = { + scope: 'number', + begin: BINARY_NUMBER_RE, + relevance: 0 + }; + const REGEXP_MODE = { + // this outer rule makes sure we actually have a WHOLE regex and not simply + // an expression such as: + // + // 3 / something + // + // (which will then blow up when regex's `illegal` sees the newline) + begin: /(?=\/[^/\n]*\/)/, + contains: [{ + scope: 'regexp', + begin: /\//, + end: /\/[gimuy]*/, + illegal: /\n/, + contains: [ + BACKSLASH_ESCAPE, + { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [BACKSLASH_ESCAPE] + } + ] + }] + }; + const TITLE_MODE = { + scope: 'title', + begin: IDENT_RE$1, + relevance: 0 + }; + const UNDERSCORE_TITLE_MODE = { + scope: 'title', + begin: UNDERSCORE_IDENT_RE, + relevance: 0 + }; + const METHOD_GUARD = { + // excludes method names from keyword processing + begin: '\\.\\s*' + UNDERSCORE_IDENT_RE, + relevance: 0 + }; + + /** + * Adds end same as begin mechanics to a mode + * + * Your mode must include at least a single () match group as that first match + * group is what is used for comparison + * @param {Partial} mode + */ + const END_SAME_AS_BEGIN = function (mode) { + return Object.assign(mode, + { + /** @type {ModeCallback} */ + 'on:begin': (m, resp) => { resp.data._beginMatch = m[1]; }, + /** @type {ModeCallback} */ + 'on:end': (m, resp) => { if (resp.data._beginMatch !== m[1]) resp.ignoreMatch(); } + }); + }; + + var MODES$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + MATCH_NOTHING_RE: MATCH_NOTHING_RE, + IDENT_RE: IDENT_RE$1, + UNDERSCORE_IDENT_RE: UNDERSCORE_IDENT_RE, + NUMBER_RE: NUMBER_RE, + C_NUMBER_RE: C_NUMBER_RE, + BINARY_NUMBER_RE: BINARY_NUMBER_RE, + RE_STARTERS_RE: RE_STARTERS_RE, + SHEBANG: SHEBANG, + BACKSLASH_ESCAPE: BACKSLASH_ESCAPE, + APOS_STRING_MODE: APOS_STRING_MODE, + QUOTE_STRING_MODE: QUOTE_STRING_MODE, + PHRASAL_WORDS_MODE: PHRASAL_WORDS_MODE, + COMMENT: COMMENT, + C_LINE_COMMENT_MODE: C_LINE_COMMENT_MODE, + C_BLOCK_COMMENT_MODE: C_BLOCK_COMMENT_MODE, + HASH_COMMENT_MODE: HASH_COMMENT_MODE, + NUMBER_MODE: NUMBER_MODE, + C_NUMBER_MODE: C_NUMBER_MODE, + BINARY_NUMBER_MODE: BINARY_NUMBER_MODE, + REGEXP_MODE: REGEXP_MODE, + TITLE_MODE: TITLE_MODE, + UNDERSCORE_TITLE_MODE: UNDERSCORE_TITLE_MODE, + METHOD_GUARD: METHOD_GUARD, + END_SAME_AS_BEGIN: END_SAME_AS_BEGIN + }); + + /** + @typedef {import('highlight.js').CallbackResponse} CallbackResponse + @typedef {import('highlight.js').CompilerExt} CompilerExt + */ + + // Grammar extensions / plugins + // See: https://github.com/highlightjs/highlight.js/issues/2833 + + // Grammar extensions allow "syntactic sugar" to be added to the grammar modes + // without requiring any underlying changes to the compiler internals. + + // `compileMatch` being the perfect small example of now allowing a grammar + // author to write `match` when they desire to match a single expression rather + // than being forced to use `begin`. The extension then just moves `match` into + // `begin` when it runs. Ie, no features have been added, but we've just made + // the experience of writing (and reading grammars) a little bit nicer. + + // ------ + + // TODO: We need negative look-behind support to do this properly + /** + * Skip a match if it has a preceding dot + * + * This is used for `beginKeywords` to prevent matching expressions such as + * `bob.keyword.do()`. The mode compiler automatically wires this up as a + * special _internal_ 'on:begin' callback for modes with `beginKeywords` + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + function skipIfHasPrecedingDot(match, response) { + const before = match.input[match.index - 1]; + if (before === ".") { + response.ignoreMatch(); + } + } + + /** + * + * @type {CompilerExt} + */ + function scopeClassName(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.className !== undefined) { + mode.scope = mode.className; + delete mode.className; + } + } + + /** + * `beginKeywords` syntactic sugar + * @type {CompilerExt} + */ + function beginKeywords(mode, parent) { + if (!parent) return; + if (!mode.beginKeywords) return; + + // for languages with keywords that include non-word characters checking for + // a word boundary is not sufficient, so instead we check for a word boundary + // or whitespace - this does no harm in any case since our keyword engine + // doesn't allow spaces in keywords anyways and we still check for the boundary + // first + mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)'; + mode.__beforeBegin = skipIfHasPrecedingDot; + mode.keywords = mode.keywords || mode.beginKeywords; + delete mode.beginKeywords; + + // prevents double relevance, the keywords themselves provide + // relevance, the mode doesn't need to double it + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 0; + } + + /** + * Allow `illegal` to contain an array of illegal values + * @type {CompilerExt} + */ + function compileIllegal(mode, _parent) { + if (!Array.isArray(mode.illegal)) return; + + mode.illegal = either(...mode.illegal); + } + + /** + * `match` to match a single expression for readability + * @type {CompilerExt} + */ + function compileMatch(mode, _parent) { + if (!mode.match) return; + if (mode.begin || mode.end) throw new Error("begin & end are not supported with match"); + + mode.begin = mode.match; + delete mode.match; + } + + /** + * provides the default 1 relevance to all modes + * @type {CompilerExt} + */ + function compileRelevance(mode, _parent) { + // eslint-disable-next-line no-undefined + if (mode.relevance === undefined) mode.relevance = 1; + } + + // allow beforeMatch to act as a "qualifier" for the match + // the full match begin must be [beforeMatch][begin] + const beforeMatchExt = (mode, parent) => { + if (!mode.beforeMatch) return; + // starts conflicts with endsParent which we need to make sure the child + // rule is not matched multiple times + if (mode.starts) throw new Error("beforeMatch cannot be used with starts"); + + const originalMode = Object.assign({}, mode); + Object.keys(mode).forEach((key) => { delete mode[key]; }); + + mode.keywords = originalMode.keywords; + mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); + mode.starts = { + relevance: 0, + contains: [ + Object.assign(originalMode, { endsParent: true }) + ] + }; + mode.relevance = 0; + + delete originalMode.beforeMatch; + }; + + // keywords that should have no default relevance value + const COMMON_KEYWORDS = [ + 'of', + 'and', + 'for', + 'in', + 'not', + 'or', + 'if', + 'then', + 'parent', // common variable name + 'list', // common variable name + 'value' // common variable name + ]; + + const DEFAULT_KEYWORD_SCOPE = "keyword"; + + /** + * Given raw keywords from a language definition, compile them. + * + * @param {string | Record | Array} rawKeywords + * @param {boolean} caseInsensitive + */ + function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { + /** @type KeywordDict */ + const compiledKeywords = Object.create(null); + + // input can be a string of keywords, an array of keywords, or a object with + // named keys representing scopeName (which can then point to a string or array) + if (typeof rawKeywords === 'string') { + compileList(scopeName, rawKeywords.split(" ")); + } else if (Array.isArray(rawKeywords)) { + compileList(scopeName, rawKeywords); + } else { + Object.keys(rawKeywords).forEach(function (scopeName) { + // collapse all our objects back into the parent object + Object.assign( + compiledKeywords, + compileKeywords(rawKeywords[scopeName], caseInsensitive, scopeName) + ); + }); + } + return compiledKeywords; + + // --- + + /** + * Compiles an individual list of keywords + * + * Ex: "for if when while|5" + * + * @param {string} scopeName + * @param {Array} keywordList + */ + function compileList(scopeName, keywordList) { + if (caseInsensitive) { + keywordList = keywordList.map(x => x.toLowerCase()); + } + keywordList.forEach(function (keyword) { + const pair = keyword.split('|'); + compiledKeywords[pair[0]] = [scopeName, scoreForKeyword(pair[0], pair[1])]; + }); + } + } + + /** + * Returns the proper score for a given keyword + * + * Also takes into account comment keywords, which will be scored 0 UNLESS + * another score has been manually assigned. + * @param {string} keyword + * @param {string} [providedScore] + */ + function scoreForKeyword(keyword, providedScore) { + // manual scores always win over common keywords + // so you can force a score of 1 if you really insist + if (providedScore) { + return Number(providedScore); + } + + return commonKeyword(keyword) ? 0 : 1; + } + + /** + * Determines if a given keyword is common or not + * + * @param {string} keyword */ + function commonKeyword(keyword) { + return COMMON_KEYWORDS.includes(keyword.toLowerCase()); + } + + /* + + For the reasoning behind this please see: + https://github.com/highlightjs/highlight.js/issues/2880#issuecomment-747275419 + + */ + + /** + * @type {Record} + */ + const seenDeprecations = {}; + + /** + * @param {string} message + */ + const error = (message) => { + console.error(message); + }; + + /** + * @param {string} message + * @param {any} args + */ + const warn = (message, ...args) => { + console.log(`WARN: ${message}`, ...args); + }; + + /** + * @param {string} version + * @param {string} message + */ + const deprecated = (version, message) => { + if (seenDeprecations[`${version}/${message}`]) return; + + console.log(`Deprecated as of ${version}. ${message}`); + seenDeprecations[`${version}/${message}`] = true; + }; + + /* eslint-disable no-throw-literal */ + + /** + @typedef {import('highlight.js').CompiledMode} CompiledMode + */ + + const MultiClassError = new Error(); + + /** + * Renumbers labeled scope names to account for additional inner match + * groups that otherwise would break everything. + * + * Lets say we 3 match scopes: + * + * { 1 => ..., 2 => ..., 3 => ... } + * + * So what we need is a clean match like this: + * + * (a)(b)(c) => [ "a", "b", "c" ] + * + * But this falls apart with inner match groups: + * + * (a)(((b)))(c) => ["a", "b", "b", "b", "c" ] + * + * Our scopes are now "out of alignment" and we're repeating `b` 3 times. + * What needs to happen is the numbers are remapped: + * + * { 1 => ..., 2 => ..., 5 => ... } + * + * We also need to know that the ONLY groups that should be output + * are 1, 2, and 5. This function handles this behavior. + * + * @param {CompiledMode} mode + * @param {Array} regexes + * @param {{key: "beginScope"|"endScope"}} opts + */ + function remapScopeNames(mode, regexes, { key }) { + let offset = 0; + const scopeNames = mode[key]; + /** @type Record */ + const emit = {}; + /** @type Record */ + const positions = {}; + + for (let i = 1; i <= regexes.length; i++) { + positions[i + offset] = scopeNames[i]; + emit[i + offset] = true; + offset += countMatchGroups(regexes[i - 1]); + } + // we use _emit to keep track of which match groups are "top-level" to avoid double + // output from inside match groups + mode[key] = positions; + mode[key]._emit = emit; + mode[key]._multi = true; + } + + /** + * @param {CompiledMode} mode + */ + function beginMultiClass(mode) { + if (!Array.isArray(mode.begin)) return; + + if (mode.skip || mode.excludeBegin || mode.returnBegin) { + error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); + throw MultiClassError; + } + + if (typeof mode.beginScope !== "object" || mode.beginScope === null) { + error("beginScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.begin, { key: "beginScope" }); + mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); + } + + /** + * @param {CompiledMode} mode + */ + function endMultiClass(mode) { + if (!Array.isArray(mode.end)) return; + + if (mode.skip || mode.excludeEnd || mode.returnEnd) { + error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); + throw MultiClassError; + } + + if (typeof mode.endScope !== "object" || mode.endScope === null) { + error("endScope must be object"); + throw MultiClassError; + } + + remapScopeNames(mode, mode.end, { key: "endScope" }); + mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); + } + + /** + * this exists only to allow `scope: {}` to be used beside `match:` + * Otherwise `beginScope` would necessary and that would look weird + + { + match: [ /def/, /\w+/ ] + scope: { 1: "keyword" , 2: "title" } + } + + * @param {CompiledMode} mode + */ + function scopeSugar(mode) { + if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { + mode.beginScope = mode.scope; + delete mode.scope; + } + } + + /** + * @param {CompiledMode} mode + */ + function MultiClass(mode) { + scopeSugar(mode); + + if (typeof mode.beginScope === "string") { + mode.beginScope = { _wrap: mode.beginScope }; + } + if (typeof mode.endScope === "string") { + mode.endScope = { _wrap: mode.endScope }; + } + + beginMultiClass(mode); + endMultiClass(mode); + } + + /** + @typedef {import('highlight.js').Mode} Mode + @typedef {import('highlight.js').CompiledMode} CompiledMode + @typedef {import('highlight.js').Language} Language + @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin + @typedef {import('highlight.js').CompiledLanguage} CompiledLanguage + */ + + // compilation + + /** + * Compiles a language definition result + * + * Given the raw result of a language definition (Language), compiles this so + * that it is ready for highlighting code. + * @param {Language} language + * @returns {CompiledLanguage} + */ + function compileLanguage(language) { + /** + * Builds a regex with the case sensitivity of the current language + * + * @param {RegExp | string} value + * @param {boolean} [global] + */ + function langRe(value, global) { + return new RegExp( + source(value), + 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '') + ); + } + + /** + Stores multiple regular expressions and allows you to quickly search for + them all in a string simultaneously - returning the first match. It does + this by creating a huge (a|b|c) regex - each individual item wrapped with () + and joined by `|` - using match groups to track position. When a match is + found checking which position in the array has content allows us to figure + out which of the original regexes / match groups triggered the match. + + The match object itself (the result of `Regex.exec`) is returned but also + enhanced by merging in any meta-data that was registered with the regex. + This is how we keep track of which mode matched, and what type of rule + (`illegal`, `begin`, end, etc). + */ + class MultiRegex { + constructor() { + this.matchIndexes = {}; + // @ts-ignore + this.regexes = []; + this.matchAt = 1; + this.position = 0; + } + + // @ts-ignore + addRule(re, opts) { + opts.position = this.position++; + // @ts-ignore + this.matchIndexes[this.matchAt] = opts; + this.regexes.push([opts, re]); + this.matchAt += countMatchGroups(re) + 1; + } + + compile() { + if (this.regexes.length === 0) { + // avoids the need to check length every time exec is called + // @ts-ignore + this.exec = () => null; + } + const terminators = this.regexes.map(el => el[1]); + this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: '|' }), true); + this.lastIndex = 0; + } + + /** @param {string} s */ + exec(s) { + this.matcherRe.lastIndex = this.lastIndex; + const match = this.matcherRe.exec(s); + if (!match) { return null; } + + // eslint-disable-next-line no-undefined + const i = match.findIndex((el, i) => i > 0 && el !== undefined); + // @ts-ignore + const matchData = this.matchIndexes[i]; + // trim off any earlier non-relevant match groups (ie, the other regex + // match groups that make up the multi-matcher) + match.splice(0, i); + + return Object.assign(match, matchData); + } + } + + /* + Created to solve the key deficiently with MultiRegex - there is no way to + test for multiple matches at a single location. Why would we need to do + that? In the future a more dynamic engine will allow certain matches to be + ignored. An example: if we matched say the 3rd regex in a large group but + decided to ignore it - we'd need to started testing again at the 4th + regex... but MultiRegex itself gives us no real way to do that. + + So what this class creates MultiRegexs on the fly for whatever search + position they are needed. + + NOTE: These additional MultiRegex objects are created dynamically. For most + grammars most of the time we will never actually need anything more than the + first MultiRegex - so this shouldn't have too much overhead. + + Say this is our search group, and we match regex3, but wish to ignore it. + + regex1 | regex2 | regex3 | regex4 | regex5 ' ie, startAt = 0 + + What we need is a new MultiRegex that only includes the remaining + possibilities: + + regex4 | regex5 ' ie, startAt = 3 + + This class wraps all that complexity up in a simple API... `startAt` decides + where in the array of expressions to start doing the matching. It + auto-increments, so if a match is found at position 2, then startAt will be + set to 3. If the end is reached startAt will return to 0. + + MOST of the time the parser will be setting startAt manually to 0. + */ + class ResumableMultiRegex { + constructor() { + // @ts-ignore + this.rules = []; + // @ts-ignore + this.multiRegexes = []; + this.count = 0; + + this.lastIndex = 0; + this.regexIndex = 0; + } + + // @ts-ignore + getMatcher(index) { + if (this.multiRegexes[index]) return this.multiRegexes[index]; + + const matcher = new MultiRegex(); + this.rules.slice(index).forEach(([re, opts]) => matcher.addRule(re, opts)); + matcher.compile(); + this.multiRegexes[index] = matcher; + return matcher; + } + + resumingScanAtSamePosition() { + return this.regexIndex !== 0; + } + + considerAll() { + this.regexIndex = 0; + } + + // @ts-ignore + addRule(re, opts) { + this.rules.push([re, opts]); + if (opts.type === "begin") this.count++; + } + + /** @param {string} s */ + exec(s) { + const m = this.getMatcher(this.regexIndex); + m.lastIndex = this.lastIndex; + let result = m.exec(s); + + // The following is because we have no easy way to say "resume scanning at the + // existing position but also skip the current rule ONLY". What happens is + // all prior rules are also skipped which can result in matching the wrong + // thing. Example of matching "booger": + + // our matcher is [string, "booger", number] + // + // ....booger.... + + // if "booger" is ignored then we'd really need a regex to scan from the + // SAME position for only: [string, number] but ignoring "booger" (if it + // was the first match), a simple resume would scan ahead who knows how + // far looking only for "number", ignoring potential string matches (or + // future "booger" matches that might be valid.) + + // So what we do: We execute two matchers, one resuming at the same + // position, but the second full matcher starting at the position after: + + // /--- resume first regex match here (for [number]) + // |/---- full match here for [string, "booger", number] + // vv + // ....booger.... + + // Which ever results in a match first is then used. So this 3-4 step + // process essentially allows us to say "match at this position, excluding + // a prior rule that was ignored". + // + // 1. Match "booger" first, ignore. Also proves that [string] does non match. + // 2. Resume matching for [number] + // 3. Match at index + 1 for [string, "booger", number] + // 4. If #2 and #3 result in matches, which came first? + if (this.resumingScanAtSamePosition()) { + if (result && result.index === this.lastIndex); else { // use the second matcher result + const m2 = this.getMatcher(0); + m2.lastIndex = this.lastIndex + 1; + result = m2.exec(s); + } + } + + if (result) { + this.regexIndex += result.position + 1; + if (this.regexIndex === this.count) { + // wrap-around to considering all matches again + this.considerAll(); + } + } + + return result; + } + } + + /** + * Given a mode, builds a huge ResumableMultiRegex that can be used to walk + * the content and find matches. + * + * @param {CompiledMode} mode + * @returns {ResumableMultiRegex} + */ + function buildModeRegex(mode) { + const mm = new ResumableMultiRegex(); + + mode.contains.forEach(term => mm.addRule(term.begin, { rule: term, type: "begin" })); + + if (mode.terminatorEnd) { + mm.addRule(mode.terminatorEnd, { type: "end" }); + } + if (mode.illegal) { + mm.addRule(mode.illegal, { type: "illegal" }); + } + + return mm; + } + + /** skip vs abort vs ignore + * + * @skip - The mode is still entered and exited normally (and contains rules apply), + * but all content is held and added to the parent buffer rather than being + * output when the mode ends. Mostly used with `sublanguage` to build up + * a single large buffer than can be parsed by sublanguage. + * + * - The mode begin ands ends normally. + * - Content matched is added to the parent mode buffer. + * - The parser cursor is moved forward normally. + * + * @abort - A hack placeholder until we have ignore. Aborts the mode (as if it + * never matched) but DOES NOT continue to match subsequent `contains` + * modes. Abort is bad/suboptimal because it can result in modes + * farther down not getting applied because an earlier rule eats the + * content but then aborts. + * + * - The mode does not begin. + * - Content matched by `begin` is added to the mode buffer. + * - The parser cursor is moved forward accordingly. + * + * @ignore - Ignores the mode (as if it never matched) and continues to match any + * subsequent `contains` modes. Ignore isn't technically possible with + * the current parser implementation. + * + * - The mode does not begin. + * - Content matched by `begin` is ignored. + * - The parser cursor is not moved forward. + */ + + /** + * Compiles an individual mode + * + * This can raise an error if the mode contains certain detectable known logic + * issues. + * @param {Mode} mode + * @param {CompiledMode | null} [parent] + * @returns {CompiledMode | never} + */ + function compileMode(mode, parent) { + const cmode = /** @type CompiledMode */ (mode); + if (mode.isCompiled) return cmode; + + [ + scopeClassName, + // do this early so compiler extensions generally don't have to worry about + // the distinction between match/begin + compileMatch, + MultiClass, + beforeMatchExt + ].forEach(ext => ext(mode, parent)); + + language.compilerExtensions.forEach(ext => ext(mode, parent)); + + // __beforeBegin is considered private API, internal use only + mode.__beforeBegin = null; + + [ + beginKeywords, + // do this later so compiler extensions that come earlier have access to the + // raw array if they wanted to perhaps manipulate it, etc. + compileIllegal, + // default to 1 relevance if not specified + compileRelevance + ].forEach(ext => ext(mode, parent)); + + mode.isCompiled = true; + + let keywordPattern = null; + if (typeof mode.keywords === "object" && mode.keywords.$pattern) { + // we need a copy because keywords might be compiled multiple times + // so we can't go deleting $pattern from the original on the first + // pass + mode.keywords = Object.assign({}, mode.keywords); + keywordPattern = mode.keywords.$pattern; + delete mode.keywords.$pattern; + } + keywordPattern = keywordPattern || /\w+/; + + if (mode.keywords) { + mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); + } + + cmode.keywordPatternRe = langRe(keywordPattern, true); + + if (parent) { + if (!mode.begin) mode.begin = /\B|\b/; + cmode.beginRe = langRe(mode.begin); + if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; + if (mode.end) cmode.endRe = langRe(mode.end); + cmode.terminatorEnd = source(mode.end) || ''; + if (mode.endsWithParent && parent.terminatorEnd) { + cmode.terminatorEnd += (mode.end ? '|' : '') + parent.terminatorEnd; + } + } + if (mode.illegal) cmode.illegalRe = langRe(/** @type {RegExp | string} */(mode.illegal)); + if (!mode.contains) mode.contains = []; + + mode.contains = [].concat(...mode.contains.map(function (c) { + return expandOrCloneMode(c === 'self' ? mode : c); + })); + mode.contains.forEach(function (c) { compileMode(/** @type Mode */(c), cmode); }); + + if (mode.starts) { + compileMode(mode.starts, parent); + } + + cmode.matcher = buildModeRegex(cmode); + return cmode; + } + + if (!language.compilerExtensions) language.compilerExtensions = []; + + // self is not valid at the top-level + if (language.contains && language.contains.includes('self')) { + throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); + } + + // we need a null object, which inherit will guarantee + language.classNameAliases = inherit$1(language.classNameAliases || {}); + + return compileMode(/** @type Mode */(language)); + } + + /** + * Determines if a mode has a dependency on it's parent or not + * + * If a mode does have a parent dependency then often we need to clone it if + * it's used in multiple places so that each copy points to the correct parent, + * where-as modes without a parent can often safely be re-used at the bottom of + * a mode chain. + * + * @param {Mode | null} mode + * @returns {boolean} - is there a dependency on the parent? + * */ + function dependencyOnParent(mode) { + if (!mode) return false; + + return mode.endsWithParent || dependencyOnParent(mode.starts); + } + + /** + * Expands a mode or clones it if necessary + * + * This is necessary for modes with parental dependenceis (see notes on + * `dependencyOnParent`) and for nodes that have `variants` - which must then be + * exploded into their own individual modes at compile time. + * + * @param {Mode} mode + * @returns {Mode | Mode[]} + * */ + function expandOrCloneMode(mode) { + if (mode.variants && !mode.cachedVariants) { + mode.cachedVariants = mode.variants.map(function (variant) { + return inherit$1(mode, { variants: null }, variant); + }); + } + + // EXPAND + // if we have variants then essentially "replace" the mode with the variants + // this happens in compileMode, where this function is called from + if (mode.cachedVariants) { + return mode.cachedVariants; + } + + // CLONE + // if we have dependencies on parents then we need a unique + // instance of ourselves, so we can be reused with many + // different parents without issue + if (dependencyOnParent(mode)) { + return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); + } + + if (Object.isFrozen(mode)) { + return inherit$1(mode); + } + + // no special dependency issues, just return ourselves + return mode; + } + + var version = "11.0.0-beta1"; + + /* + Syntax highlighting with language autodetection. + https://highlightjs.org/ + */ + + /** + @typedef {import('highlight.js').Mode} Mode + @typedef {import('highlight.js').CompiledMode} CompiledMode + @typedef {import('highlight.js').Language} Language + @typedef {import('highlight.js').HLJSApi} HLJSApi + @typedef {import('highlight.js').HLJSPlugin} HLJSPlugin + @typedef {import('highlight.js').PluginEvent} PluginEvent + @typedef {import('highlight.js').HLJSOptions} HLJSOptions + @typedef {import('highlight.js').LanguageFn} LanguageFn + @typedef {import('highlight.js').HighlightedHTMLElement} HighlightedHTMLElement + @typedef {import('highlight.js').BeforeHighlightContext} BeforeHighlightContext + @typedef {import('highlight.js/private').MatchType} MatchType + @typedef {import('highlight.js/private').KeywordData} KeywordData + @typedef {import('highlight.js/private').EnhancedMatch} EnhancedMatch + @typedef {import('highlight.js/private').AnnotatedError} AnnotatedError + @typedef {import('highlight.js').AutoHighlightResult} AutoHighlightResult + @typedef {import('highlight.js').HighlightOptions} HighlightOptions + @typedef {import('highlight.js').HighlightResult} HighlightResult + */ + + + const escape = escapeHTML; + const inherit = inherit$1; + const NO_MATCH = Symbol("nomatch"); + const MAX_KEYWORD_HITS = 7; + + /** + * @param {any} hljs - object that is extended (legacy) + * @returns {HLJSApi} + */ + const HLJS = function (hljs) { + // Global internal variables used within the highlight.js library. + /** @type {Record} */ + const languages = Object.create(null); + /** @type {Record} */ + const aliases = Object.create(null); + /** @type {HLJSPlugin[]} */ + const plugins = []; + + // safe/production mode - swallows more errors, tries to keep running + // even if a single syntax or parse hits a fatal error + let SAFE_MODE = true; + const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; + /** @type {Language} */ + const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: 'Plain text', contains: [] }; + + // Global options used when within external APIs. This is modified when + // calling the `hljs.configure` function. + /** @type HLJSOptions */ + let options = { + ignoreUnescapedHTML: false, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: 'hljs-', + cssSelector: 'pre code', + languages: null, + // beta configuration options, subject to change, welcome to discuss + // https://github.com/highlightjs/highlight.js/issues/1086 + __emitter: TokenTreeEmitter + }; + + /* Utility functions */ + + /** + * Tests a language name to see if highlighting should be skipped + * @param {string} languageName + */ + function shouldNotHighlight(languageName) { + return options.noHighlightRe.test(languageName); + } + + /** + * @param {HighlightedHTMLElement} block - the HTML element to determine language for + */ + function blockLanguage(block) { + let classes = block.className + ' '; + + classes += block.parentNode ? block.parentNode.className : ''; + + // language-* takes precedence over non-prefixed class names. + const match = options.languageDetectRe.exec(classes); + if (match) { + const language = getLanguage(match[1]); + if (!language) { + warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); + warn("Falling back to no-highlight mode for this block.", block); + } + return language ? match[1] : 'no-highlight'; + } + + return classes + .split(/\s+/) + .find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); + } + + /** + * Core highlighting function. + * + * OLD API + * highlight(lang, code, ignoreIllegals, continuation) + * + * NEW API + * highlight(code, {lang, ignoreIllegals}) + * + * @param {string} codeOrLanguageName - the language to use for highlighting + * @param {string | HighlightOptions} optionsOrCode - the code to highlight + * @param {boolean} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * @param {CompiledMode} [continuation] - current continuation mode, if any + * + * @returns {HighlightResult} Result - an object that represents the result + * @property {string} language - the language name + * @property {number} relevance - the relevance score + * @property {string} value - the highlighted HTML code + * @property {string} code - the original raw code + * @property {CompiledMode} top - top of the current mode stack + * @property {boolean} illegal - indicates whether any illegal matches were found + */ + function highlight(codeOrLanguageName, optionsOrCode, ignoreIllegals, continuation) { + let code = ""; + let languageName = ""; + if (typeof optionsOrCode === "object") { + code = codeOrLanguageName; + ignoreIllegals = optionsOrCode.ignoreIllegals; + languageName = optionsOrCode.language; + // continuation not supported at all via the new API + // eslint-disable-next-line no-undefined + continuation = undefined; + } else { + // old API + deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); + deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); + languageName = codeOrLanguageName; + code = optionsOrCode; + } + + // https://github.com/highlightjs/highlight.js/issues/3149 + // eslint-disable-next-line no-undefined + if (ignoreIllegals === undefined) { ignoreIllegals = true; } + + /** @type {BeforeHighlightContext} */ + const context = { + code, + language: languageName + }; + // the plugin can change the desired language or the code to be highlighted + // just be changing the object it was passed + fire("before:highlight", context); + + // a before plugin can usurp the result completely by providing it's own + // in which case we don't even need to call highlight + const result = context.result + ? context.result + : _highlight(context.language, context.code, ignoreIllegals, continuation); + + result.code = context.code; + // the plugin can change anything in result to suite it + fire("after:highlight", result); + + return result; + } + + /** + * private highlight that's used internally and does not fire callbacks + * + * @param {string} languageName - the language to use for highlighting + * @param {string} codeToHighlight - the code to highlight + * @param {boolean?} [ignoreIllegals] - whether to ignore illegal matches, default is to bail + * @param {CompiledMode?} [continuation] - current continuation mode, if any + * @returns {HighlightResult} - result of the highlight operation + */ + function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { + const keywordHits = Object.create(null); + + /** + * Return keyword data if a match is a keyword + * @param {CompiledMode} mode - current mode + * @param {string} matchText - the textual match + * @returns {KeywordData | false} + */ + function keywordData(mode, matchText) { + return mode.keywords[matchText]; + } + + function processKeywords() { + if (!top.keywords) { + emitter.addText(modeBuffer); + return; + } + + let lastIndex = 0; + top.keywordPatternRe.lastIndex = 0; + let match = top.keywordPatternRe.exec(modeBuffer); + let buf = ""; + + while (match) { + buf += modeBuffer.substring(lastIndex, match.index); + const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; + const data = keywordData(top, word); + if (data) { + const [kind, keywordRelevance] = data; + emitter.addText(buf); + buf = ""; + + keywordHits[word] = (keywordHits[word] || 0) + 1; + if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance; + if (kind.startsWith("_")) { + // _ implied for relevance only, do not highlight + // by applying a class name + buf += match[0]; + } else { + const cssClass = language.classNameAliases[kind] || kind; + emitter.addKeyword(match[0], cssClass); + } + } else { + buf += match[0]; + } + lastIndex = top.keywordPatternRe.lastIndex; + match = top.keywordPatternRe.exec(modeBuffer); + } + buf += modeBuffer.substr(lastIndex); + emitter.addText(buf); + } + + function processSubLanguage() { + if (modeBuffer === "") return; + /** @type HighlightResult */ + let result = null; + + if (typeof top.subLanguage === 'string') { + if (!languages[top.subLanguage]) { + emitter.addText(modeBuffer); + return; + } + result = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]); + continuations[top.subLanguage] = /** @type {CompiledMode} */ (result._top); + } else { + result = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null); + } + + // Counting embedded language score towards the host language may be disabled + // with zeroing the containing mode relevance. Use case in point is Markdown that + // allows XML everywhere and makes every XML snippet to have a much larger Markdown + // score. + if (top.relevance > 0) { + relevance += result.relevance; + } + emitter.addSublanguage(result._emitter, result.language); + } + + function processBuffer() { + if (top.subLanguage != null) { + processSubLanguage(); + } else { + processKeywords(); + } + modeBuffer = ''; + } + + /** + * @param {CompiledMode} mode + * @param {RegExpMatchArray} match + */ + function emitMultiClass(scope, match) { + let i = 1; + // eslint-disable-next-line no-undefined + while (match[i] !== undefined) { + if (!scope._emit[i]) { i++; continue; } + const klass = language.classNameAliases[scope[i]] || scope[i]; + const text = match[i]; + if (klass) { + emitter.addKeyword(text, klass); + } else { + modeBuffer = text; + processKeywords(); + modeBuffer = ""; + } + i++; + } + } + + /** + * @param {CompiledMode} mode - new mode to start + * @param {RegExpMatchArray} match + */ + function startNewMode(mode, match) { + if (mode.scope && typeof mode.scope === "string") { + emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); + } + if (mode.beginScope) { + // beginScope just wraps the begin match itself in a scope + if (mode.beginScope._wrap) { + emitter.addKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); + modeBuffer = ""; + } else if (mode.beginScope._multi) { + // at this point modeBuffer should just be the match + emitMultiClass(mode.beginScope, match); + modeBuffer = ""; + } + } + + top = Object.create(mode, { parent: { value: top } }); + return top; + } + + /** + * @param {CompiledMode } mode - the mode to potentially end + * @param {RegExpMatchArray} match - the latest match + * @param {string} matchPlusRemainder - match plus remainder of content + * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode + */ + function endOfMode(mode, match, matchPlusRemainder) { + let matched = startsWith(mode.endRe, matchPlusRemainder); + + if (matched) { + if (mode["on:end"]) { + const resp = new Response(mode); + mode["on:end"](match, resp); + if (resp.isMatchIgnored) matched = false; + } + + if (matched) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + } + // even if on:end fires an `ignore` it's still possible + // that we might trigger the end node because of a parent mode + if (mode.endsWithParent) { + return endOfMode(mode.parent, match, matchPlusRemainder); + } + } + + /** + * Handle matching but then ignoring a sequence of text + * + * @param {string} lexeme - string containing full match text + */ + function doIgnore(lexeme) { + if (top.matcher.regexIndex === 0) { + // no more regexes to potentially match here, so we move the cursor forward one + // space + modeBuffer += lexeme[0]; + return 1; + } else { + // no need to move the cursor, we still have additional regexes to try and + // match at this very spot + resumeScanAtSamePosition = true; + return 0; + } + } + + /** + * Handle the start of a new potential mode match + * + * @param {EnhancedMatch} match - the current match + * @returns {number} how far to advance the parse cursor + */ + function doBeginMatch(match) { + const lexeme = match[0]; + const newMode = match.rule; + + const resp = new Response(newMode); + // first internal before callbacks, then the public ones + const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; + for (const cb of beforeCallbacks) { + if (!cb) continue; + cb(match, resp); + if (resp.isMatchIgnored) return doIgnore(lexeme); + } + + if (newMode.skip) { + modeBuffer += lexeme; + } else { + if (newMode.excludeBegin) { + modeBuffer += lexeme; + } + processBuffer(); + if (!newMode.returnBegin && !newMode.excludeBegin) { + modeBuffer = lexeme; + } + } + startNewMode(newMode, match); + return newMode.returnBegin ? 0 : lexeme.length; + } + + /** + * Handle the potential end of mode + * + * @param {RegExpMatchArray} match - the current match + */ + function doEndMatch(match) { + const lexeme = match[0]; + const matchPlusRemainder = codeToHighlight.substr(match.index); + + const endMode = endOfMode(top, match, matchPlusRemainder); + if (!endMode) { return NO_MATCH; } + + const origin = top; + if (top.endScope && top.endScope._wrap) { + processBuffer(); + emitter.addKeyword(lexeme, top.endScope._wrap); + } else if (top.endScope && top.endScope._multi) { + processBuffer(); + emitMultiClass(top.endScope, match); + } else if (origin.skip) { + modeBuffer += lexeme; + } else { + if (!(origin.returnEnd || origin.excludeEnd)) { + modeBuffer += lexeme; + } + processBuffer(); + if (origin.excludeEnd) { + modeBuffer = lexeme; + } + } + do { + if (top.scope && !top.isMultiClass) { + emitter.closeNode(); + } + if (!top.skip && !top.subLanguage) { + relevance += top.relevance; + } + top = top.parent; + } while (top !== endMode.parent); + if (endMode.starts) { + startNewMode(endMode.starts, match); + } + return origin.returnEnd ? 0 : lexeme.length; + } + + function processContinuations() { + const list = []; + for (let current = top; current !== language; current = current.parent) { + if (current.scope) { + list.unshift(current.scope); + } + } + list.forEach(item => emitter.openNode(item)); + } + + /** @type {{type?: MatchType, index?: number, rule?: Mode}}} */ + let lastMatch = {}; + + /** + * Process an individual match + * + * @param {string} textBeforeMatch - text preceding the match (since the last match) + * @param {EnhancedMatch} [match] - the match itself + */ + function processLexeme(textBeforeMatch, match) { + const lexeme = match && match[0]; + + // add non-matched text to the current mode buffer + modeBuffer += textBeforeMatch; + + if (lexeme == null) { + processBuffer(); + return 0; + } + + // we've found a 0 width match and we're stuck, so we need to advance + // this happens when we have badly behaved rules that have optional matchers to the degree that + // sometimes they can end up matching nothing at all + // Ref: https://github.com/highlightjs/highlight.js/issues/2140 + if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { + // spit the "skipped" character that our regex choked on back into the output sequence + modeBuffer += codeToHighlight.slice(match.index, match.index + 1); + if (!SAFE_MODE) { + /** @type {AnnotatedError} */ + const err = new Error(`0 width match regex (${languageName})`); + err.languageName = languageName; + err.badRule = lastMatch.rule; + throw err; + } + return 1; + } + lastMatch = match; + + if (match.type === "begin") { + return doBeginMatch(match); + } else if (match.type === "illegal" && !ignoreIllegals) { + // illegal match, we do not continue processing + /** @type {AnnotatedError} */ + const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.scope || '') + '"'); + err.mode = top; + throw err; + } else if (match.type === "end") { + const processed = doEndMatch(match); + if (processed !== NO_MATCH) { + return processed; + } + } + + // edge case for when illegal matches $ (end of line) which is technically + // a 0 width match but not a begin/end match so it's not caught by the + // first handler (when ignoreIllegals is true) + if (match.type === "illegal" && lexeme === "") { + // advance so we aren't stuck in an infinite loop + return 1; + } + + // infinite loops are BAD, this is a last ditch catch all. if we have a + // decent number of iterations yet our index (cursor position in our + // parsing) still 3x behind our index then something is very wrong + // so we bail + if (iterations > 100000 && iterations > match.index * 3) { + const err = new Error('potential infinite loop, way more iterations than matches'); + throw err; + } + + /* + Why might be find ourselves here? An potential end match that was + triggered but could not be completed. IE, `doEndMatch` returned NO_MATCH. + (this could be because a callback requests the match be ignored, etc) + + This causes no real harm other than stopping a few times too many. + */ + + modeBuffer += lexeme; + return lexeme.length; + } + + const language = getLanguage(languageName); + if (!language) { + error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); + throw new Error('Unknown language: "' + languageName + '"'); + } + + const md = compileLanguage(language); + let result = ''; + /** @type {CompiledMode} */ + let top = continuation || md; + /** @type Record */ + const continuations = {}; // keep continuations for sub-languages + const emitter = new options.__emitter(options); + processContinuations(); + let modeBuffer = ''; + let relevance = 0; + let index = 0; + let iterations = 0; + let resumeScanAtSamePosition = false; + + try { + top.matcher.considerAll(); + + for (; ;) { + iterations++; + if (resumeScanAtSamePosition) { + // only regexes not matched previously will now be + // considered for a potential match + resumeScanAtSamePosition = false; + } else { + top.matcher.considerAll(); + } + top.matcher.lastIndex = index; + + const match = top.matcher.exec(codeToHighlight); + // console.log("match", match[0], match.rule && match.rule.begin) + + if (!match) break; + + const beforeMatch = codeToHighlight.substring(index, match.index); + const processedCount = processLexeme(beforeMatch, match); + index = match.index + processedCount; + } + processLexeme(codeToHighlight.substr(index)); + emitter.closeAllNodes(); + emitter.finalize(); + result = emitter.toHTML(); + + return { + language: languageName, + value: result, + relevance: relevance, + illegal: false, + _emitter: emitter, + _top: top + }; + } catch (err) { + if (err.message && err.message.includes('Illegal')) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: true, + relevance: 0, + _illegalBy: { + message: err.message, + index: index, + context: codeToHighlight.slice(index - 100, index + 100), + mode: err.mode, + resultSoFar: result + }, + _emitter: emitter + }; + } else if (SAFE_MODE) { + return { + language: languageName, + value: escape(codeToHighlight), + illegal: false, + relevance: 0, + errorRaised: err, + _emitter: emitter, + _top: top + }; + } else { + throw err; + } + } + } + + /** + * returns a valid highlight result, without actually doing any actual work, + * auto highlight starts with this and it's possible for small snippets that + * auto-detection may not find a better match + * @param {string} code + * @returns {HighlightResult} + */ + function justTextHighlightResult(code) { + const result = { + value: escape(code), + illegal: false, + relevance: 0, + _top: PLAINTEXT_LANGUAGE, + _emitter: new options.__emitter(options) + }; + result._emitter.addText(code); + return result; + } + + /** + Highlighting with language detection. Accepts a string with the code to + highlight. Returns an object with the following properties: + + - language (detected language) + - relevance (int) + - value (an HTML string with highlighting markup) + - secondBest (object with the same structure for second-best heuristically + detected language, may be absent) + + @param {string} code + @param {Array} [languageSubset] + @returns {AutoHighlightResult} + */ + function highlightAuto(code, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + const plaintext = justTextHighlightResult(code); + + const results = languageSubset.filter(getLanguage).filter(autoDetection).map(name => + _highlight(name, code, false) + ); + results.unshift(plaintext); // plaintext is always an option + + const sorted = results.sort((a, b) => { + // sort base on relevance + if (a.relevance !== b.relevance) return b.relevance - a.relevance; + + // always award the tie to the base language + // ie if C++ and Arduino are tied, it's more likely to be C++ + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } + + // otherwise say they are equal, which has the effect of sorting on + // relevance while preserving the original ordering - which is how ties + // have historically been settled, ie the language that comes first always + // wins in the case of a tie + return 0; + }); + + const [best, secondBest] = sorted; + + /** @type {AutoHighlightResult} */ + const result = best; + result.secondBest = secondBest; + + return result; + } + + /** + * Builds new class name for block given the language name + * + * @param {HTMLElement} element + * @param {string} [currentLang] + * @param {string} [resultLang] + */ + function updateClassName(element, currentLang, resultLang) { + const language = (currentLang && aliases[currentLang]) || resultLang; + + element.classList.add("hljs"); + element.classList.add(`language-${language}`); + } + + /** + * Applies highlighting to a DOM node containing code. + * + * @param {HighlightedHTMLElement} element - the HTML element to highlight + */ + function highlightElement(element) { + /** @type HTMLElement */ + let node = null; + const language = blockLanguage(element); + + if (shouldNotHighlight(language)) return; + + fire("before:highlightElement", + { el: element, language: language }); + + // we should be all text, no child nodes + if (!options.ignoreUnescapedHTML && element.children.length > 0) { + console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); + console.warn("https://github.com/highlightjs/highlight.js/issues/2886"); + console.warn(element); + } + + node = element; + const text = node.textContent; + const result = language ? highlight(text, { language, ignoreIllegals: true }) : highlightAuto(text); + + fire("after:highlightElement", { el: element, result, text }); + + element.innerHTML = result.value; + updateClassName(element, language, result.language); + element.result = { + language: result.language, + // TODO: remove with version 11.0 + re: result.relevance, + relevance: result.relevance + }; + if (result.secondBest) { + element.secondBest = { + language: result.secondBest.language, + relevance: result.secondBest.relevance + }; + } + } + + /** + * Updates highlight.js global options with the passed options + * + * @param {Partial} userOptions + */ + function configure(userOptions) { + options = inherit(options, userOptions); + } + + // TODO: remove v12, deprecated + const initHighlighting = () => { + highlightAll(); + deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); + }; + + // TODO: remove v12, deprecated + function initHighlightingOnLoad() { + highlightAll(); + deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); + } + + let wantsHighlight = false; + + /** + * auto-highlights all pre>code elements on the page + */ + function highlightAll() { + // if we are called too early in the loading process + if (document.readyState === "loading") { + wantsHighlight = true; + return; + } + + const blocks = document.querySelectorAll(options.cssSelector); + blocks.forEach(highlightElement); + } + + function boot() { + // if a highlight was requested before DOM was loaded, do now + if (wantsHighlight) highlightAll(); + } + + // make sure we are in the browser environment + if (typeof window !== 'undefined' && window.addEventListener) { + window.addEventListener('DOMContentLoaded', boot, false); + } + + /** + * Register a language grammar module + * + * @param {string} languageName + * @param {LanguageFn} languageDefinition + */ + function registerLanguage(languageName, languageDefinition) { + let lang = null; + try { + lang = languageDefinition(hljs); + } catch (error$1) { + error("Language definition for '{}' could not be registered.".replace("{}", languageName)); + // hard or soft error + if (!SAFE_MODE) { throw error$1; } else { error(error$1); } + // languages that have serious errors are replaced with essentially a + // "plaintext" stand-in so that the code blocks will still get normal + // css classes applied to them - and one bad language won't break the + // entire highlighter + lang = PLAINTEXT_LANGUAGE; + } + // give it a temporary name if it doesn't have one in the meta-data + if (!lang.name) lang.name = languageName; + languages[languageName] = lang; + lang.rawDefinition = languageDefinition.bind(null, hljs); + + if (lang.aliases) { + registerAliases(lang.aliases, { languageName }); + } + } + + /** + * Remove a language grammar module + * + * @param {string} languageName + */ + function unregisterLanguage(languageName) { + delete languages[languageName]; + for (const alias of Object.keys(aliases)) { + if (aliases[alias] === languageName) { + delete aliases[alias]; + } + } + } + + /** + * @returns {string[]} List of language internal names + */ + function listLanguages() { + return Object.keys(languages); + } + + /** + * @param {string} name - name of the language to retrieve + * @returns {Language | undefined} + */ + function getLanguage(name) { + name = (name || '').toLowerCase(); + return languages[name] || languages[aliases[name]]; + } + + /** + * + * @param {string|string[]} aliasList - single alias or list of aliases + * @param {{languageName: string}} opts + */ + function registerAliases(aliasList, { languageName }) { + if (typeof aliasList === 'string') { + aliasList = [aliasList]; + } + aliasList.forEach(alias => { aliases[alias.toLowerCase()] = languageName; }); + } + + /** + * Determines if a given language has auto-detection enabled + * @param {string} name - name of the language + */ + function autoDetection(name) { + const lang = getLanguage(name); + return lang && !lang.disableAutodetect; + } + + /** + * Upgrades the old highlightBlock plugins to the new + * highlightElement API + * @param {HLJSPlugin} plugin + */ + function upgradePluginAPI(plugin) { + // TODO: remove with v12 + if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { + plugin["before:highlightElement"] = (data) => { + plugin["before:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { + plugin["after:highlightElement"] = (data) => { + plugin["after:highlightBlock"]( + Object.assign({ block: data.el }, data) + ); + }; + } + } + + /** + * @param {HLJSPlugin} plugin + */ + function addPlugin(plugin) { + upgradePluginAPI(plugin); + plugins.push(plugin); + } + + /** + * + * @param {PluginEvent} event + * @param {any} args + */ + function fire(event, args) { + const cb = event; + plugins.forEach(function (plugin) { + if (plugin[cb]) { + plugin[cb](args); + } + }); + } + + /** + * + * @param {HighlightedHTMLElement} el + */ + function deprecateHighlightBlock(el) { + deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); + deprecated("10.7.0", "Please use highlightElement now."); + + return highlightElement(el); + } + + /* Interface definition */ + Object.assign(hljs, { + highlight, + highlightAuto, + highlightAll, + highlightElement, + // TODO: Remove with v12 API + highlightBlock: deprecateHighlightBlock, + configure, + initHighlighting, + initHighlightingOnLoad, + registerLanguage, + unregisterLanguage, + listLanguages, + getLanguage, + registerAliases, + autoDetection, + inherit, + addPlugin + }); + + hljs.debugMode = function () { SAFE_MODE = false; }; + hljs.safeMode = function () { SAFE_MODE = true; }; + hljs.versionString = version; + + for (const key in MODES$1) { + // @ts-ignore + if (typeof MODES$1[key] === "object") { + // @ts-ignore + deepFreeze$1(MODES$1[key]); + } + } + + // merge all the modes/regexes into our main object + Object.assign(hljs, MODES$1); + + return hljs; + }; + + // export an "instance" of the highlighter + var HighlightJS = HLJS({}); + + /* + Language: Bash + Author: vah + Contributrors: Benjamin Pannell + Website: https://www.gnu.org/software/bash/ + Category: common + */ + + /** @type LanguageFn */ + function bash(hljs) { + const VAR = {}; + const BRACED_VAR = { + begin: /\$\{/, + end: /\}/, + contains: [ + "self", + { + begin: /:-/, + contains: [VAR] + } // default values + ] + }; + Object.assign(VAR, { + className: 'variable', + variants: [ + { + begin: concat(/\$[\w\d#@][\w\d_]*/, + // negative look-ahead tries to avoid matching patterns that are not + // Perl at all like $ident$, @ident@, etc. + `(?![\\w\\d])(?![$])`) + }, + BRACED_VAR + ] + }); + + const SUBST = { + className: 'subst', + begin: /\$\(/, end: /\)/, + contains: [hljs.BACKSLASH_ESCAPE] + }; + const HERE_DOC = { + begin: /<<-?\s*(?=\w+)/, + starts: { + contains: [ + hljs.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + className: 'string' + }) + ] + } + }; + const QUOTE_STRING = { + className: 'string', + begin: /"/, end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VAR, + SUBST + ] + }; + SUBST.contains.push(QUOTE_STRING); + const ESCAPED_QUOTE = { + className: '', + begin: /\\"/ + + }; + const APOS_STRING = { + className: 'string', + begin: /'/, end: /'/ + }; + const ARITHMETIC = { + begin: /\$\(\(/, + end: /\)\)/, + contains: [ + { begin: /\d+#[0-9a-f]+/, className: "number" }, + hljs.NUMBER_MODE, + VAR + ] + }; + const SH_LIKE_SHELLS = [ + "fish", + "bash", + "zsh", + "sh", + "csh", + "ksh", + "tcsh", + "dash", + "scsh", + ]; + const KNOWN_SHEBANG = hljs.SHEBANG({ + binary: `(${SH_LIKE_SHELLS.join("|")})`, + relevance: 10 + }); + const FUNCTION = { + className: 'function', + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: true, + contains: [hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ })], + relevance: 0 + }; + + const KEYWORDS = [ + "if", + "then", + "else", + "elif", + "fi", + "for", + "while", + "in", + "do", + "done", + "case", + "esac", + "function" + ]; + + const LITERALS = [ + "true", + "false" + ]; + + return { + name: 'Bash', + aliases: ['sh'], + keywords: { + $pattern: /\b[a-z._-]+\b/, + keyword: KEYWORDS, + literal: LITERALS, + built_in: + // Shell built-ins + // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html + 'break cd continue eval exec exit export getopts hash pwd readonly return shift test times ' + + 'trap umask unset ' + + // Bash built-ins + 'alias bind builtin caller command declare echo enable help let local logout mapfile printf ' + + 'read readarray source type typeset ulimit unalias ' + + // Shell modifiers + 'set shopt ' + + // Zsh built-ins + 'autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles ' + + 'compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate ' + + 'fc fg float functions getcap getln history integer jobs kill limit log noglob popd print ' + + 'pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit ' + + 'unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof ' + + 'zpty zregexparse zsocket zstyle ztcp' + }, + contains: [ + KNOWN_SHEBANG, // to catch known shells and boost relevancy + hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang + FUNCTION, + ARITHMETIC, + hljs.HASH_COMMENT_MODE, + HERE_DOC, + QUOTE_STRING, + ESCAPED_QUOTE, + APOS_STRING, + VAR + ] + }; + } + + + const MODES = (hljs) => { + return { + IMPORTANT: { + scope: 'meta', + begin: '!important' + }, + HEXCOLOR: { + scope: 'number', + begin: '#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})' + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: 'selector-attr', + begin: /\[/, + end: /\]/, + illegal: '$', + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + CSS_NUMBER_MODE: { + scope: 'number', + begin: hljs.NUMBER_RE + '(' + + '%|em|ex|ch|rem' + + '|vw|vh|vmin|vmax' + + '|cm|mm|in|pt|pc|px' + + '|deg|grad|rad|turn' + + '|s|ms' + + '|Hz|kHz' + + '|dpi|dpcm|dppx' + + ')?', + relevance: 0 + } + }; + }; + + const TAGS = [ + 'a', + 'abbr', + 'address', + 'article', + 'aside', + 'audio', + 'b', + 'blockquote', + 'body', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'dd', + 'del', + 'details', + 'dfn', + 'div', + 'dl', + 'dt', + 'em', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'header', + 'hgroup', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'label', + 'legend', + 'li', + 'main', + 'mark', + 'menu', + 'nav', + 'object', + 'ol', + 'p', + 'q', + 'quote', + 'samp', + 'section', + 'span', + 'strong', + 'summary', + 'sup', + 'table', + 'tbody', + 'td', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'tr', + 'ul', + 'var', + 'video' + ]; + + const MEDIA_FEATURES = [ + 'any-hover', + 'any-pointer', + 'aspect-ratio', + 'color', + 'color-gamut', + 'color-index', + 'device-aspect-ratio', + 'device-height', + 'device-width', + 'display-mode', + 'forced-colors', + 'grid', + 'height', + 'hover', + 'inverted-colors', + 'monochrome', + 'orientation', + 'overflow-block', + 'overflow-inline', + 'pointer', + 'prefers-color-scheme', + 'prefers-contrast', + 'prefers-reduced-motion', + 'prefers-reduced-transparency', + 'resolution', + 'scan', + 'scripting', + 'update', + 'width', + // TODO: find a better solution? + 'min-width', + 'max-width', + 'min-height', + 'max-height' + ]; + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes + const PSEUDO_CLASSES = [ + 'active', + 'any-link', + 'blank', + 'checked', + 'current', + 'default', + 'defined', + 'dir', // dir() + 'disabled', + 'drop', + 'empty', + 'enabled', + 'first', + 'first-child', + 'first-of-type', + 'fullscreen', + 'future', + 'focus', + 'focus-visible', + 'focus-within', + 'has', // has() + 'host', // host or host() + 'host-context', // host-context() + 'hover', + 'indeterminate', + 'in-range', + 'invalid', + 'is', // is() + 'lang', // lang() + 'last-child', + 'last-of-type', + 'left', + 'link', + 'local-link', + 'not', // not() + 'nth-child', // nth-child() + 'nth-col', // nth-col() + 'nth-last-child', // nth-last-child() + 'nth-last-col', // nth-last-col() + 'nth-last-of-type', //nth-last-of-type() + 'nth-of-type', //nth-of-type() + 'only-child', + 'only-of-type', + 'optional', + 'out-of-range', + 'past', + 'placeholder-shown', + 'read-only', + 'read-write', + 'required', + 'right', + 'root', + 'scope', + 'target', + 'target-within', + 'user-invalid', + 'valid', + 'visited', + 'where' // where() + ]; + + // https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements + const PSEUDO_ELEMENTS = [ + 'after', + 'backdrop', + 'before', + 'cue', + 'cue-region', + 'first-letter', + 'first-line', + 'grammar-error', + 'marker', + 'part', + 'placeholder', + 'selection', + 'slotted', + 'spelling-error' + ]; + + const ATTRIBUTES = [ + 'align-content', + 'align-items', + 'align-self', + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'auto', + 'backface-visibility', + 'background', + 'background-attachment', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-repeat', + 'background-size', + 'border', + 'border-bottom', + 'border-bottom-color', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-bottom-style', + 'border-bottom-width', + 'border-collapse', + 'border-color', + 'border-image', + 'border-image-outset', + 'border-image-repeat', + 'border-image-slice', + 'border-image-source', + 'border-image-width', + 'border-left', + 'border-left-color', + 'border-left-style', + 'border-left-width', + 'border-radius', + 'border-right', + 'border-right-color', + 'border-right-style', + 'border-right-width', + 'border-spacing', + 'border-style', + 'border-top', + 'border-top-color', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-top-style', + 'border-top-width', + 'border-width', + 'bottom', + 'box-decoration-break', + 'box-shadow', + 'box-sizing', + 'break-after', + 'break-before', + 'break-inside', + 'caption-side', + 'clear', + 'clip', + 'clip-path', + 'color', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + 'content', + 'counter-increment', + 'counter-reset', + 'cursor', + 'direction', + 'display', + 'empty-cells', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'float', + 'font', + 'font-display', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-size', + 'font-size-adjust', + 'font-smoothing', + 'font-stretch', + 'font-style', + 'font-variant', + 'font-variant-ligatures', + 'font-variation-settings', + 'font-weight', + 'height', + 'hyphens', + 'icon', + 'image-orientation', + 'image-rendering', + 'image-resolution', + 'ime-mode', + 'inherit', + 'initial', + 'justify-content', + 'left', + 'letter-spacing', + 'line-height', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + 'margin', + 'margin-bottom', + 'margin-left', + 'margin-right', + 'margin-top', + 'marks', + 'mask', + 'max-height', + 'max-width', + 'min-height', + 'min-width', + 'nav-down', + 'nav-index', + 'nav-left', + 'nav-right', + 'nav-up', + 'none', + 'normal', + 'object-fit', + 'object-position', + 'opacity', + 'order', + 'orphans', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'overflow', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + 'padding', + 'padding-bottom', + 'padding-left', + 'padding-right', + 'padding-top', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'perspective', + 'perspective-origin', + 'pointer-events', + 'position', + 'quotes', + 'resize', + 'right', + 'src', // @font-face + 'tab-size', + 'table-layout', + 'text-align', + 'text-align-last', + 'text-decoration', + 'text-decoration-color', + 'text-decoration-line', + 'text-decoration-style', + 'text-indent', + 'text-overflow', + 'text-rendering', + 'text-shadow', + 'text-transform', + 'text-underline-position', + 'top', + 'transform', + 'transform-origin', + 'transform-style', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'unicode-bidi', + 'vertical-align', + 'visibility', + 'white-space', + 'widows', + 'width', + 'word-break', + 'word-spacing', + 'word-wrap', + 'z-index' + // reverse makes sure longer attributes `font-weight` are matched fully + // instead of getting false positives on say `font` + ].reverse(); + + // some grammars use them all as a single group + const PSEUDO_SELECTORS = PSEUDO_CLASSES.concat(PSEUDO_ELEMENTS); + + + // https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10 + var decimalDigits = '[0-9](_*[0-9])*'; + var frac = `\\.(${decimalDigits})`; + var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*'; + var NUMERIC = { + className: 'number', + variants: [ + // DecimalFloatingPointLiteral + // including ExponentPart + { + begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})[fFdD]?\\b` + }, + // excluding ExponentPart + { begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` }, + { begin: `(${frac})[fFdD]?\\b` }, + { begin: `\\b(${decimalDigits})[fFdD]\\b` }, + + // HexadecimalFloatingPointLiteral + { + begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` + + `[pP][+-]?(${decimalDigits})[fFdD]?\\b` + }, + + // DecimalIntegerLiteral + { begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' }, + + // HexIntegerLiteral + { begin: `\\b0[xX](${hexDigits})[lL]?\\b` }, + + // OctalIntegerLiteral + { begin: '\\b0(_*[0-7])*[lL]?\\b' }, + + // BinaryIntegerLiteral + { begin: '\\b0[bB][01](_*[01])*[lL]?\\b' }, + ], + relevance: 0 + }; + + + /** + * Allows recursive regex expressions to a given depth + * + * ie: recurRegex("(abc~~~)", /~~~/g, 2) becomes: + * (abc(abc(abc))) + * + * @param {string} re + * @param {RegExp} substitution (should be a g mode regex) + * @param {number} depth + * @returns {string}`` + */ + function recurRegex(re, substitution, depth) { + if (depth === -1) return ""; + + return re.replace(substitution, _ => { + return recurRegex(re, substitution, depth - 1); + }); + } + + const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; + const KEYWORDS = [ + "as", // for exports + "in", + "of", + "if", + "for", + "while", + "finally", + "var", + "new", + "function", + "do", + "return", + "void", + "else", + "break", + "catch", + "instanceof", + "with", + "throw", + "case", + "default", + "try", + "switch", + "continue", + "typeof", + "delete", + "let", + "yield", + "const", + "class", + // JS handles these with a special rule + // "get", + // "set", + "debugger", + "async", + "await", + "static", + "import", + "from", + "export", + "extends" + ]; + const LITERALS = [ + "true", + "false", + "null", + "undefined", + "NaN", + "Infinity" + ]; + + const TYPES = [ + "Intl", + "DataView", + "Number", + "Math", + "Date", + "String", + "RegExp", + "Object", + "Function", + "Boolean", + "Error", + "Symbol", + "Set", + "Map", + "WeakSet", + "WeakMap", + "Proxy", + "Reflect", + "JSON", + "Promise", + "Float64Array", + "Int16Array", + "Int32Array", + "Int8Array", + "Uint16Array", + "Uint32Array", + "Float32Array", + "Array", + "Uint8Array", + "Uint8ClampedArray", + "ArrayBuffer", + "BigInt64Array", + "BigUint64Array", + "BigInt" + ]; + + const ERROR_TYPES = [ + "EvalError", + "InternalError", + "RangeError", + "ReferenceError", + "SyntaxError", + "TypeError", + "URIError" + ]; + + const BUILT_IN_GLOBALS = [ + "setInterval", + "setTimeout", + "clearInterval", + "clearTimeout", + + "require", + "exports", + + "eval", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "decodeURI", + "decodeURIComponent", + "encodeURI", + "encodeURIComponent", + "escape", + "unescape" + ]; + + const BUILT_IN_VARIABLES = [ + "arguments", + "this", + "super", + "console", + "window", + "document", + "localStorage", + "module", + "global" // Node.js + ]; + + const BUILT_INS = [].concat( + BUILT_IN_GLOBALS, + TYPES, + ERROR_TYPES + ); + + /* + Language: JavaScript + Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions. + Category: common, scripting, web + Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript + */ + + /** @type LanguageFn */ + function javascript(hljs) { + /** + * Takes a string like " { + const tag = "', + end: '' + }; + const XML_TAG = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + /** + * @param {RegExpMatchArray} match + * @param {CallbackResponse} response + */ + isTrulyOpeningTag: (match, response) => { + const afterMatchIndex = match[0].length + match.index; + const nextChar = match.input[afterMatchIndex]; + // nested type? + // HTML should not include another raw `<` inside a tag + // But a type might: `>`, etc. + if (nextChar === "<") { + response.ignoreMatch(); + return; + } + // + // This is now either a tag or a type. + if (nextChar === ">") { + // if we cannot find a matching closing tag, then we + // will ignore it + if (!hasClosingTag(match, { after: afterMatchIndex })) { + response.ignoreMatch(); + } + } + } + }; + const KEYWORDS$1 = { + $pattern: IDENT_RE, + keyword: KEYWORDS, + literal: LITERALS, + built_in: BUILT_INS, + "variable.language": BUILT_IN_VARIABLES + }; + + // https://tc39.es/ecma262/#sec-literals-numeric-literals + const decimalDigits = '[0-9](_?[0-9])*'; + const frac = `\\.(${decimalDigits})`; + // DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`; + const NUMBER = { + className: 'number', + variants: [ + // DecimalLiteral + { + begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` + + `[eE][+-]?(${decimalDigits})\\b` + }, + { begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` }, + + // DecimalBigIntegerLiteral + { begin: `\\b(0|[1-9](_?[0-9])*)n\\b` }, + + // NonDecimalIntegerLiteral + { begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" }, + { begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" }, + { begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" }, + + // LegacyOctalIntegerLiteral (does not include underscore separators) + // https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals + { begin: "\\b0[0-7]+n?\\b" }, + ], + relevance: 0 + }; + + const SUBST = { + className: 'subst', + begin: '\\$\\{', + end: '\\}', + keywords: KEYWORDS$1, + contains: [] // defined later + }; + const HTML_TEMPLATE = { + begin: 'html`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'xml' + } + }; + const CSS_TEMPLATE = { + begin: 'css`', + end: '', + starts: { + end: '`', + returnEnd: false, + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ], + subLanguage: 'css' + } + }; + const TEMPLATE_STRING = { + className: 'string', + begin: '`', + end: '`', + contains: [ + hljs.BACKSLASH_ESCAPE, + SUBST + ] + }; + const JSDOC_COMMENT = hljs.COMMENT( + /\/\*\*(?!\/)/, + '\\*/', + { + relevance: 0, + contains: [ + { + begin: '(?=@[A-Za-z]+)', + relevance: 0, + contains: [ + { + className: 'doctag', + begin: '@[A-Za-z]+' + }, + { + className: 'type', + begin: '\\{', + end: '\\}', + excludeEnd: true, + excludeBegin: true, + relevance: 0 + }, + { + className: 'variable', + begin: IDENT_RE$1 + '(?=\\s*(-)|$)', + endsParent: true, + relevance: 0 + }, + // eat spaces (not newlines) so we can find + // types or variables + { + begin: /(?=[^\n])\s/, + relevance: 0 + } + ] + } + ] + } + ); + const COMMENT = { + className: "comment", + variants: [ + JSDOC_COMMENT, + hljs.C_BLOCK_COMMENT_MODE, + hljs.C_LINE_COMMENT_MODE + ] + }; + const SUBST_INTERNALS = [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + TEMPLATE_STRING, + NUMBER, + hljs.REGEXP_MODE + ]; + SUBST.contains = SUBST_INTERNALS + .concat({ + // we need to pair up {} inside our subst to prevent + // it from ending too early by matching another } + begin: /\{/, + end: /\}/, + keywords: KEYWORDS$1, + contains: [ + "self" + ].concat(SUBST_INTERNALS) + }); + const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains); + const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([ + // eat recursive parens in sub expressions + { + begin: /\(/, + end: /\)/, + keywords: KEYWORDS$1, + contains: ["self"].concat(SUBST_AND_COMMENTS) + } + ]); + const PARAMS = { + className: 'params', + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + }; + + // ES6 classes + const CLASS_OR_EXTENDS = { + variants: [ + { + match: [ + /class/, + /\s+/, + IDENT_RE$1 + ], + scope: { + 1: "keyword", + 3: "title.class" + } + }, + { + match: [ + /extends/, + /\s+/, + concat(IDENT_RE$1, "(", concat(/\./, IDENT_RE$1), ")*") + ], + scope: { + 1: "keyword", + 3: "title.class.inherited" + } + } + ] + }; + + const CLASS_REFERENCE = { + relevance: 0, + match: /\b[A-Z][a-z]+([A-Z][a-z]+)*/, + className: "title.class", + keywords: { + _: [ + // se we still get relevance credit for JS library classes + ...TYPES, + ...ERROR_TYPES + ] + } + }; + + const USE_STRICT = { + label: "use_strict", + className: 'meta', + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }; + + const FUNCTION_DEFINITION = { + variants: [ + { + match: [ + /function/, + /\s+/, + IDENT_RE$1, + /(?=\s*\()/ + ] + }, + // anonymous function + { + match: [ + /function/, + /\s*(?=\()/ + ] + } + ], + className: { + 1: "keyword", + 3: "title.function" + }, + label: "func.def", + contains: [PARAMS], + illegal: /%/ + }; + + const UPPER_CASE_CONSTANT = { + relevance: 0, + match: /\b[A-Z][A-Z_]+\b/, + className: "variable.constant" + }; + + function noneOf(list) { + return concat("(?!", list.join("|"), ")"); + } + + const FUNCTION_CALL = { + match: concat( + /\b/, + noneOf([ + ...BUILT_IN_GLOBALS, + "super" + ]), + IDENT_RE$1, lookahead(/\(/)), + className: "title.function", + relevance: 0 + }; + + const PROPERTY_ACCESS = { + begin: concat(/\./, lookahead( + concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/) + )), + end: IDENT_RE$1, + excludeBegin: true, + keywords: "prototype", + className: "property", + relevance: 0 + }; + + const GETTER_OR_SETTER = { + match: [ + /get|set/, + /\s+/, + IDENT_RE$1, + /(?=\()/ + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + { // eat to avoid empty params + begin: /\(\)/ + }, + PARAMS + ] + }; + + const FUNC_LEAD_IN_RE = '(\\(' + + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>'; + + const FUNCTION_VARIABLE = { + match: [ + /const|var|let/, /\s+/, + IDENT_RE$1, /\s*/, + /=\s*/, + lookahead(FUNC_LEAD_IN_RE) + ], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [ + PARAMS + ] + }; + + return { + name: 'Javascript', + aliases: ['js', 'jsx', 'mjs', 'cjs'], + keywords: KEYWORDS$1, + // this will be extended by TypeScript + exports: { PARAMS_CONTAINS }, + illegal: /#(?![$_A-z])/, + contains: [ + hljs.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), + USE_STRICT, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + HTML_TEMPLATE, + CSS_TEMPLATE, + TEMPLATE_STRING, + COMMENT, + NUMBER, + CLASS_REFERENCE, + { + className: 'attr', + begin: IDENT_RE$1 + lookahead(':'), + relevance: 0 + }, + FUNCTION_VARIABLE, + { // "value" container + begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*', + keywords: 'return throw case', + relevance: 0, + contains: [ + COMMENT, + hljs.REGEXP_MODE, + { + className: 'function', + // we have to count the parens to make sure we actually have the + // correct bounding ( ) before the =>. There could be any number of + // sub-expressions inside also surrounded by parens. + begin: FUNC_LEAD_IN_RE, + returnBegin: true, + end: '\\s*=>', + contains: [ + { + className: 'params', + variants: [ + { + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }, + { + className: null, + begin: /\(\s*\)/, + skip: true + }, + { + begin: /\(/, + end: /\)/, + excludeBegin: true, + excludeEnd: true, + keywords: KEYWORDS$1, + contains: PARAMS_CONTAINS + } + ] + } + ] + }, + { // could be a comma delimited list of params to a function call + begin: /,/, + relevance: 0 + }, + { + match: /\s+/, + relevance: 0 + }, + { // JSX + variants: [ + { begin: FRAGMENT.begin, end: FRAGMENT.end }, + { + begin: XML_TAG.begin, + // we carefully check the opening tag to see if it truly + // is a tag and not a false positive + 'on:begin': XML_TAG.isTrulyOpeningTag, + end: XML_TAG.end + } + ], + subLanguage: 'xml', + contains: [ + { + begin: XML_TAG.begin, + end: XML_TAG.end, + skip: true, + contains: ['self'] + } + ] + } + ], + }, + FUNCTION_DEFINITION, + { + // prevent this from getting swallowed up by function + // since they appear "function like" + beginKeywords: "while if switch catch for" + }, + { + // we have to count the parens to make sure we actually have the correct + // bounding ( ). There could be any number of sub-expressions inside + // also surrounded by parens. + begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE + + '\\(' + // first parens + '[^()]*(\\(' + + '[^()]*(\\(' + + '[^()]*' + + '\\)[^()]*)*' + + '\\)[^()]*)*' + + '\\)\\s*\\{', // end parens + returnBegin: true, + label: "func.def", + contains: [ + PARAMS, + hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" }) + ] + }, + // catch ... so it won't trigger the property rule below + { + match: /\.\.\./, + relevance: 0 + }, + PROPERTY_ACCESS, + // hack: prevents detection of keywords in some circumstances + // .keyword() + // $keyword = x + { + match: '\\$' + IDENT_RE$1, + relevance: 0 + }, + { + match: [/\bconstructor(?=\s*\()/], + className: { 1: "title.function" }, + contains: [PARAMS] + }, + FUNCTION_CALL, + UPPER_CASE_CONSTANT, + CLASS_OR_EXTENDS, + GETTER_OR_SETTER, + { + match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + } + ] + }; + } + + /* + Language: JSON + Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format. + Author: Ivan Sagalaev + Website: http://www.json.org + Category: common, protocols, web + */ + + function json(hljs) { + const ATTRIBUTE = { + className: 'attr', + begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/, + relevance: 1.01 + }; + const PUNCTUATION = { + match: /[{}[\],:]/, + className: "punctuation", + relevance: 0 + }; + // normally we would rely on `keywords` for this but using a mode here allows us + // to use the very tight `illegal: \S` rule later to flag any other character + // as illegal indicating that despite looking like JSON we do not truly have + // JSON and thus improve false-positively greatly since JSON will try and claim + // all sorts of JSON looking stuff + const LITERALS = { + beginKeywords: [ + "true", + "false", + "null" + ].join(" ") + }; + + return { + name: 'JSON', + contains: [ + ATTRIBUTE, + PUNCTUATION, + hljs.QUOTE_STRING_MODE, + LITERALS, + hljs.C_NUMBER_MODE, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ], + illegal: '\\S' + }; + } + + + /** @type LanguageFn */ + function xml(hljs) { + // Element names can contain letters, digits, hyphens, underscores, and periods + const TAG_NAME_RE = concat(/[A-Z_]/, optional(/[A-Z0-9_.-]*:/), /[A-Z0-9_.-]*/); + const XML_IDENT_RE = /[A-Za-z0-9._:-]+/; + const XML_ENTITIES = { + className: 'symbol', + begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ + }; + const XML_META_KEYWORDS = { + begin: /\s/, + contains: [ + { + className: 'keyword', + begin: /#?[a-z_][a-z1-9_-]+/, + illegal: /\n/ + } + ] + }; + const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, { + begin: /\(/, + end: /\)/ + }); + const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { + className: 'string' + }); + const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { + className: 'string' + }); + const TAG_INTERNALS = { + endsWithParent: true, + illegal: /`]+/ + } + ] + } + ] + } + ] + }; + return { + name: 'HTML, XML', + aliases: [ + 'html', + 'xhtml', + 'rss', + 'atom', + 'xjb', + 'xsd', + 'xsl', + 'plist', + 'wsf', + 'svg' + ], + case_insensitive: true, + contains: [ + { + className: 'meta', + begin: //, + relevance: 10, + contains: [ + XML_META_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE, + XML_META_PAR_KEYWORDS, + { + begin: /\[/, + end: /\]/, + contains: [ + { + className: 'meta', + begin: //, + contains: [ + XML_META_KEYWORDS, + XML_META_PAR_KEYWORDS, + QUOTE_META_STRING_MODE, + APOS_META_STRING_MODE + ] + } + ] + } + ] + }, + hljs.COMMENT( + //, + { + relevance: 10 + } + ), + { + begin: //, + relevance: 10 + }, + XML_ENTITIES, + { + className: 'meta', + begin: /<\?xml/, + end: /\?>/, + relevance: 10 + }, + { + className: 'tag', + /* + The lookahead pattern (?=...) ensures that 'begin' only matches + ')/, + end: />/, + keywords: { + name: 'style' + }, + contains: [TAG_INTERNALS], + starts: { + end: /<\/style>/, + returnEnd: true, + subLanguage: [ + 'css', + 'xml' + ] + } + }, + { + className: 'tag', + // See the comment in the