From 9f9b28e872005da6379a6eee53de017e5652dc51 Mon Sep 17 00:00:00 2001 From: "Deployment Bot (from Travis CI)" Date: Sun, 9 May 2021 12:19:34 +0000 Subject: [PATCH] Deploy harttle/liquidjs to github.com/harttle/liquidjs.git:gh-pages --- CNAME | 1 + api/classes/cache_lru_.lru.html | 287 + api/classes/cache_lru_.node.html | 219 + api/classes/context_context_.context.html | 386 + api/classes/drop_blank_drop_.blankdrop.html | 242 + api/classes/drop_block_drop_.blockdrop.html | 216 + api/classes/drop_drop_.drop.html | 204 + api/classes/drop_empty_drop_.emptydrop.html | 240 + .../drop_forloop_drop_.forloopdrop.html | 253 + api/classes/drop_null_drop_.nulldrop.html | 239 + ...p_tablerowloop_drop_.tablerowloopdrop.html | 287 + api/classes/liquid_.liquid.html | 702 ++ .../parser_parse_stream_.parsestream.html | 281 + api/classes/parser_parser_.parser.html | 251 + api/classes/parser_tokenizer_.tokenizer.html | 568 ++ api/classes/render_emitter_.emitter.html | 222 + .../render_expression_.expression.html | 217 + api/classes/render_render_.render.html | 203 + .../template_filter_filter_.filter.html | 238 + ...template_filter_filter_map_.filtermap.html | 268 + api/classes/template_html_.html.html | 229 + api/classes/template_output_.output.html | 233 + api/classes/template_tag_hash_.hash.html | 216 + api/classes/template_tag_tag_.tag.html | 240 + api/classes/template_tag_tag_map_.tagmap.html | 221 + .../template_template_impl_.templateimpl.html | 202 + api/classes/template_value_.value.html | 227 + ...okens_delimited_token_.delimitedtoken.html | 270 + .../tokens_filter_token_.filtertoken.html | 257 + api/classes/tokens_hash_token_.hashtoken.html | 257 + api/classes/tokens_html_token_.htmltoken.html | 253 + ...ens_identifier_token_.identifiertoken.html | 265 + .../tokens_literal_token_.literaltoken.html | 246 + .../tokens_number_token_.numbertoken.html | 241 + .../tokens_operator_token_.operatortoken.html | 250 + .../tokens_output_token_.outputtoken.html | 256 + ...rty_access_token_.propertyaccesstoken.html | 249 + .../tokens_quoted_token_.quotedtoken.html | 243 + .../tokens_range_token_.rangetoken.html | 257 + api/classes/tokens_tag_token_.tagtoken.html | 262 + api/classes/tokens_token_.token.html | 248 + api/classes/util_error_.assertionerror.html | 212 + ...error_.internalundefinedvariableerror.html | 215 + api/classes/util_error_.liquiderror.html | 232 + api/classes/util_error_.parseerror.html | 219 + api/classes/util_error_.rendererror.html | 236 + .../util_error_.tokenizationerror.html | 219 + .../util_error_.undefinedvariableerror.html | 219 + api/classes/util_strftime_.timezonedate.html | 829 ++ api/enums/context_block_mode_.blockmode.html | 181 + api/enums/parser_token_kind_.tokenkind.html | 214 + api/globals.html | 176 + api/interfaces/cache_cache_.cache.html | 220 + .../context_scope_.plainobject.html | 184 + .../drop_comparable_.comparable.html | 268 + api/interfaces/fs_fs_.fs.html | 274 + .../liquid_options_.liquidoptions.html | 246 + ...liquid_options_.normalizedfulloptions.html | 269 + .../liquid_options_.normalizedoptions.html | 272 + .../render_operator_.operators.html | 204 + ...mplate_filter_filter_impl_.filterimpl.html | 184 + ...ilter_impl_options_.filterimploptions.html | 203 + .../template_tag_tag_impl_.tagimpl.html | 220 + ..._tag_tag_impl_options_.tagimploptions.html | 212 + .../template_template_.template.html | 206 + api/interfaces/util_async_.thenable.html | 216 + api/interfaces/util_operator_trie_.trie.html | 182 + .../util_strftime_.formatoptions.html | 187 + api/modules/builtin_filters_array_.html | 447 + api/modules/builtin_filters_date_.html | 217 + api/modules/builtin_filters_html_.html | 283 + api/modules/builtin_filters_index_.html | 176 + api/modules/builtin_filters_math_.html | 339 + api/modules/builtin_filters_object_.html | 220 + api/modules/builtin_filters_string_.html | 507 ++ api/modules/builtin_filters_url_.html | 209 + api/modules/builtin_tags_assign_.html | 176 + api/modules/builtin_tags_block_.html | 176 + api/modules/builtin_tags_break_.html | 176 + api/modules/builtin_tags_capture_.html | 192 + api/modules/builtin_tags_case_.html | 176 + api/modules/builtin_tags_comment_.html | 176 + api/modules/builtin_tags_continue_.html | 176 + api/modules/builtin_tags_cycle_.html | 176 + api/modules/builtin_tags_decrement_.html | 176 + api/modules/builtin_tags_for_.html | 176 + api/modules/builtin_tags_if_.html | 176 + api/modules/builtin_tags_include_.html | 176 + api/modules/builtin_tags_increment_.html | 176 + api/modules/builtin_tags_index_.html | 229 + api/modules/builtin_tags_layout_.html | 176 + api/modules/builtin_tags_raw_.html | 176 + api/modules/builtin_tags_render_.html | 176 + api/modules/builtin_tags_tablerow_.html | 176 + api/modules/builtin_tags_unless_.html | 176 + api/modules/cache_cache_.html | 176 + api/modules/cache_lru_.html | 176 + api/modules/context_block_mode_.html | 176 + api/modules/context_context_.html | 247 + api/modules/context_scope_.html | 178 + api/modules/drop_blank_drop_.html | 176 + api/modules/drop_block_drop_.html | 176 + api/modules/drop_comparable_.html | 192 + api/modules/drop_drop_.html | 176 + api/modules/drop_empty_drop_.html | 176 + api/modules/drop_forloop_drop_.html | 176 + api/modules/drop_null_drop_.html | 176 + api/modules/drop_tablerowloop_drop_.html | 176 + api/modules/fs_browser_.html | 289 + api/modules/fs_fs_.html | 176 + api/modules/fs_node_.html | 322 + api/modules/liquid_.html | 176 + api/modules/liquid_options_.html | 273 + api/modules/parser_filter_arg_.html | 197 + api/modules/parser_match_operator_.html | 209 + api/modules/parser_parse_stream_.html | 196 + api/modules/parser_parse_string_literal_.html | 227 + api/modules/parser_parser_.html | 176 + api/modules/parser_token_kind_.html | 176 + api/modules/parser_tokenizer_.html | 176 + api/modules/parser_whitespace_ctrl_.html | 238 + api/modules/render_boolean_.html | 217 + api/modules/render_emitter_.html | 176 + api/modules/render_expression_.html | 351 + api/modules/render_operator_.html | 365 + api/modules/render_render_.html | 176 + api/modules/template_filter_filter_.html | 176 + api/modules/template_filter_filter_impl_.html | 176 + .../template_filter_filter_impl_options_.html | 176 + api/modules/template_filter_filter_map_.html | 176 + api/modules/template_html_.html | 176 + api/modules/template_output_.html | 176 + api/modules/template_tag_hash_.html | 176 + api/modules/template_tag_tag_.html | 176 + api/modules/template_tag_tag_impl_.html | 176 + .../template_tag_tag_impl_options_.html | 176 + api/modules/template_tag_tag_map_.html | 176 + api/modules/template_template_.html | 176 + api/modules/template_template_impl_.html | 176 + api/modules/template_value_.html | 176 + api/modules/tokens_delimited_token_.html | 176 + api/modules/tokens_filter_token_.html | 176 + api/modules/tokens_hash_token_.html | 176 + api/modules/tokens_html_token_.html | 176 + api/modules/tokens_identifier_token_.html | 176 + api/modules/tokens_literal_token_.html | 176 + api/modules/tokens_number_token_.html | 176 + api/modules/tokens_operator_token_.html | 195 + api/modules/tokens_output_token_.html | 176 + .../tokens_property_access_token_.html | 176 + api/modules/tokens_quoted_token_.html | 176 + api/modules/tokens_range_token_.html | 176 + api/modules/tokens_tag_token_.html | 176 + api/modules/tokens_token_.html | 176 + api/modules/tokens_toplevel_token_.html | 178 + api/modules/tokens_value_token_.html | 178 + api/modules/types_.html | 176 + api/modules/util_assert_.html | 198 + api/modules/util_async_.html | 310 + api/modules/util_character_.html | 199 + api/modules/util_collection_.html | 209 + api/modules/util_error_.html | 213 + api/modules/util_literal_.html | 191 + api/modules/util_operator_trie_.html | 192 + api/modules/util_strftime_.html | 928 +++ api/modules/util_type_guards_.html | 379 + api/modules/util_underscore_.html | 706 ++ assets/algolia/algoliasearch.js | 7190 +++++++++++++++++ assets/algolia/algoliasearch.min.js | 4 + assets/algolia/algoliasearchLite.js | 4453 ++++++++++ assets/algolia/algoliasearchLite.min.js | 3 + browserconfig.xml | 12 + css/navy.css | 1 + favicon.ico | Bin 0 -> 9662 bytes filters/abs.html | 197 + filters/append.html | 191 + filters/at_least.html | 190 + filters/at_most.html | 190 + filters/capitalize.html | 191 + filters/ceil.html | 203 + filters/compact.html | 192 + filters/concat.html | 189 + filters/date.html | 208 + filters/default.html | 200 + filters/divided_by.html | 194 + filters/downcase.html | 190 + filters/escape.html | 192 + filters/escape_once.html | 196 + filters/first.html | 193 + filters/floor.html | 203 + filters/join.html | 184 + filters/json.html | 184 + filters/last.html | 193 + filters/lstrip.html | 184 + filters/map.html | 185 + filters/minus.html | 196 + filters/modulo.html | 196 + filters/newline_to_br.html | 184 + filters/overview.html | 206 + filters/plus.html | 196 + filters/prepend.html | 191 + filters/remove.html | 184 + filters/remove_first.html | 184 + filters/replace.html | 184 + filters/replace_first.html | 184 + filters/reverse.html | 191 + filters/round.html | 196 + filters/rstrip.html | 184 + filters/size.html | 193 + filters/slice.html | 204 + filters/sort.html | 187 + filters/sort_natural.html | 187 + filters/split.html | 184 + filters/strip.html | 184 + filters/strip_html.html | 184 + filters/strip_newlines.html | 184 + filters/times.html | 196 + filters/truncate.html | 199 + filters/truncatewords.html | 198 + filters/uniq.html | 184 + filters/upcase.html | 190 + filters/url_decode.html | 184 + filters/url_encode.html | 190 + filters/where.html | 200 + fonts/icomoon.eot | Bin 0 -> 5036 bytes fonts/icomoon.svg | 27 + fonts/icomoon.ttf | Bin 0 -> 4872 bytes fonts/icomoon.woff | Bin 0 -> 4948 bytes icon/apple-touch-icon-114x114.png | Bin 0 -> 2576 bytes icon/apple-touch-icon-120x120.png | Bin 0 -> 3469 bytes icon/apple-touch-icon-144x144.png | Bin 0 -> 4188 bytes icon/apple-touch-icon-152x152.png | Bin 0 -> 4449 bytes icon/apple-touch-icon-57x57.png | Bin 0 -> 1401 bytes icon/apple-touch-icon-60x60.png | Bin 0 -> 1480 bytes icon/apple-touch-icon-72x72.png | Bin 0 -> 1761 bytes icon/apple-touch-icon-76x76.png | Bin 0 -> 1832 bytes icon/apple-touch-icon-precomposed.png | Bin 0 -> 5143 bytes icon/apple-touch-icon.png | Bin 0 -> 10247 bytes icon/become_a_patron_button@2x.png | Bin 0 -> 6579 bytes icon/favicon-160x160.png | Bin 0 -> 4635 bytes icon/favicon-16x16.png | Bin 0 -> 669 bytes icon/favicon-196x196.png | Bin 0 -> 5577 bytes icon/favicon-32x32.png | Bin 0 -> 992 bytes icon/favicon-96x96.png | Bin 0 -> 2223 bytes icon/logo.png | Bin 0 -> 10247 bytes icon/mstile-144x144.png | Bin 0 -> 4188 bytes icon/mstile-150x150.png | Bin 0 -> 4369 bytes icon/mstile-310x150.png | Bin 0 -> 5371 bytes icon/mstile-310x310.png | Bin 0 -> 9195 bytes icon/mstile-70x70.png | Bin 0 -> 1728 bytes index.html | 266 + js/main.js | 121 + manifest.json | 1 + playground.html | 149 + robots.txt | 1 + sitemap.xml | 3497 ++++++++ sw.js | 58 + tags/assign.html | 191 + tags/capture.html | 191 + tags/case.html | 184 + tags/comment.html | 184 + tags/cycle.html | 196 + tags/decrement.html | 186 + tags/for.html | 257 + tags/if.html | 191 + tags/include.html | 195 + tags/increment.html | 193 + tags/layout.html | 203 + tags/overview.html | 212 + tags/raw.html | 184 + tags/render.html | 202 + tags/tablerow.html | 200 + tags/unless.html | 187 + tutorials/caching.html | 189 + tutorials/contribution-guidelines.html | 187 + tutorials/differences.html | 186 + tutorials/intro-to-liquid.html | 199 + tutorials/migrate-to-9.html | 197 + tutorials/operators.html | 187 + tutorials/options.html | 215 + tutorials/partials-and-layouts.html | 193 + tutorials/plugins.html | 190 + tutorials/register-filters-tags.html | 191 + tutorials/render-file.html | 208 + tutorials/setup.html | 208 + tutorials/truthy-and-falsy.html | 307 + tutorials/use-in-expressjs.html | 194 + tutorials/whitespace-control.html | 199 + zh-cn/api/classes/cache_lru_.lru.html | 287 + zh-cn/api/classes/cache_lru_.node.html | 219 + .../api/classes/context_context_.context.html | 386 + .../classes/drop_blank_drop_.blankdrop.html | 242 + .../classes/drop_block_drop_.blockdrop.html | 216 + zh-cn/api/classes/drop_drop_.drop.html | 204 + .../classes/drop_empty_drop_.emptydrop.html | 240 + .../drop_forloop_drop_.forloopdrop.html | 253 + .../api/classes/drop_null_drop_.nulldrop.html | 239 + ...p_tablerowloop_drop_.tablerowloopdrop.html | 287 + zh-cn/api/classes/liquid_.liquid.html | 702 ++ .../parser_parse_stream_.parsestream.html | 281 + zh-cn/api/classes/parser_parser_.parser.html | 251 + .../classes/parser_tokenizer_.tokenizer.html | 568 ++ .../api/classes/render_emitter_.emitter.html | 222 + .../render_expression_.expression.html | 217 + zh-cn/api/classes/render_render_.render.html | 203 + .../template_filter_filter_.filter.html | 238 + ...template_filter_filter_map_.filtermap.html | 268 + zh-cn/api/classes/template_html_.html.html | 229 + .../api/classes/template_output_.output.html | 233 + .../api/classes/template_tag_hash_.hash.html | 216 + zh-cn/api/classes/template_tag_tag_.tag.html | 240 + .../classes/template_tag_tag_map_.tagmap.html | 221 + .../template_template_impl_.templateimpl.html | 202 + zh-cn/api/classes/template_value_.value.html | 227 + ...okens_delimited_token_.delimitedtoken.html | 270 + .../tokens_filter_token_.filtertoken.html | 257 + .../classes/tokens_hash_token_.hashtoken.html | 257 + .../classes/tokens_html_token_.htmltoken.html | 253 + ...ens_identifier_token_.identifiertoken.html | 265 + .../tokens_literal_token_.literaltoken.html | 246 + .../tokens_number_token_.numbertoken.html | 241 + .../tokens_operator_token_.operatortoken.html | 250 + .../tokens_output_token_.outputtoken.html | 256 + ...rty_access_token_.propertyaccesstoken.html | 249 + .../tokens_quoted_token_.quotedtoken.html | 243 + .../tokens_range_token_.rangetoken.html | 257 + .../classes/tokens_tag_token_.tagtoken.html | 262 + zh-cn/api/classes/tokens_token_.token.html | 248 + .../classes/util_error_.assertionerror.html | 212 + ...error_.internalundefinedvariableerror.html | 215 + .../api/classes/util_error_.liquiderror.html | 232 + zh-cn/api/classes/util_error_.parseerror.html | 219 + .../api/classes/util_error_.rendererror.html | 236 + .../util_error_.tokenizationerror.html | 219 + .../util_error_.undefinedvariableerror.html | 219 + .../classes/util_strftime_.timezonedate.html | 829 ++ .../enums/context_block_mode_.blockmode.html | 181 + .../enums/parser_token_kind_.tokenkind.html | 214 + zh-cn/api/globals.html | 176 + zh-cn/api/interfaces/cache_cache_.cache.html | 220 + .../context_scope_.plainobject.html | 184 + .../drop_comparable_.comparable.html | 268 + zh-cn/api/interfaces/fs_fs_.fs.html | 274 + .../liquid_options_.liquidoptions.html | 246 + ...liquid_options_.normalizedfulloptions.html | 269 + .../liquid_options_.normalizedoptions.html | 272 + .../render_operator_.operators.html | 204 + ...mplate_filter_filter_impl_.filterimpl.html | 184 + ...ilter_impl_options_.filterimploptions.html | 203 + .../template_tag_tag_impl_.tagimpl.html | 220 + ..._tag_tag_impl_options_.tagimploptions.html | 212 + .../template_template_.template.html | 206 + .../api/interfaces/util_async_.thenable.html | 216 + .../interfaces/util_operator_trie_.trie.html | 182 + .../util_strftime_.formatoptions.html | 187 + zh-cn/api/modules/builtin_filters_array_.html | 447 + zh-cn/api/modules/builtin_filters_date_.html | 217 + zh-cn/api/modules/builtin_filters_html_.html | 283 + zh-cn/api/modules/builtin_filters_index_.html | 176 + zh-cn/api/modules/builtin_filters_math_.html | 339 + .../api/modules/builtin_filters_object_.html | 220 + .../api/modules/builtin_filters_string_.html | 507 ++ zh-cn/api/modules/builtin_filters_url_.html | 209 + zh-cn/api/modules/builtin_tags_assign_.html | 176 + zh-cn/api/modules/builtin_tags_block_.html | 176 + zh-cn/api/modules/builtin_tags_break_.html | 176 + zh-cn/api/modules/builtin_tags_capture_.html | 192 + zh-cn/api/modules/builtin_tags_case_.html | 176 + zh-cn/api/modules/builtin_tags_comment_.html | 176 + zh-cn/api/modules/builtin_tags_continue_.html | 176 + zh-cn/api/modules/builtin_tags_cycle_.html | 176 + .../api/modules/builtin_tags_decrement_.html | 176 + zh-cn/api/modules/builtin_tags_for_.html | 176 + zh-cn/api/modules/builtin_tags_if_.html | 176 + zh-cn/api/modules/builtin_tags_include_.html | 176 + .../api/modules/builtin_tags_increment_.html | 176 + zh-cn/api/modules/builtin_tags_index_.html | 229 + zh-cn/api/modules/builtin_tags_layout_.html | 176 + zh-cn/api/modules/builtin_tags_raw_.html | 176 + zh-cn/api/modules/builtin_tags_render_.html | 176 + zh-cn/api/modules/builtin_tags_tablerow_.html | 176 + zh-cn/api/modules/builtin_tags_unless_.html | 176 + zh-cn/api/modules/cache_cache_.html | 176 + zh-cn/api/modules/cache_lru_.html | 176 + zh-cn/api/modules/context_block_mode_.html | 176 + zh-cn/api/modules/context_context_.html | 247 + zh-cn/api/modules/context_scope_.html | 178 + zh-cn/api/modules/drop_blank_drop_.html | 176 + zh-cn/api/modules/drop_block_drop_.html | 176 + zh-cn/api/modules/drop_comparable_.html | 192 + zh-cn/api/modules/drop_drop_.html | 176 + zh-cn/api/modules/drop_empty_drop_.html | 176 + zh-cn/api/modules/drop_forloop_drop_.html | 176 + zh-cn/api/modules/drop_null_drop_.html | 176 + .../api/modules/drop_tablerowloop_drop_.html | 176 + zh-cn/api/modules/fs_browser_.html | 289 + zh-cn/api/modules/fs_fs_.html | 176 + zh-cn/api/modules/fs_node_.html | 322 + zh-cn/api/modules/liquid_.html | 176 + zh-cn/api/modules/liquid_options_.html | 273 + zh-cn/api/modules/parser_filter_arg_.html | 197 + zh-cn/api/modules/parser_match_operator_.html | 209 + zh-cn/api/modules/parser_parse_stream_.html | 196 + .../modules/parser_parse_string_literal_.html | 227 + zh-cn/api/modules/parser_parser_.html | 176 + zh-cn/api/modules/parser_token_kind_.html | 176 + zh-cn/api/modules/parser_tokenizer_.html | 176 + .../api/modules/parser_whitespace_ctrl_.html | 238 + zh-cn/api/modules/render_boolean_.html | 217 + zh-cn/api/modules/render_emitter_.html | 176 + zh-cn/api/modules/render_expression_.html | 351 + zh-cn/api/modules/render_operator_.html | 365 + zh-cn/api/modules/render_render_.html | 176 + .../api/modules/template_filter_filter_.html | 176 + .../modules/template_filter_filter_impl_.html | 176 + .../template_filter_filter_impl_options_.html | 176 + .../modules/template_filter_filter_map_.html | 176 + zh-cn/api/modules/template_html_.html | 176 + zh-cn/api/modules/template_output_.html | 176 + zh-cn/api/modules/template_tag_hash_.html | 176 + zh-cn/api/modules/template_tag_tag_.html | 176 + zh-cn/api/modules/template_tag_tag_impl_.html | 176 + .../template_tag_tag_impl_options_.html | 176 + zh-cn/api/modules/template_tag_tag_map_.html | 176 + zh-cn/api/modules/template_template_.html | 176 + .../api/modules/template_template_impl_.html | 176 + zh-cn/api/modules/template_value_.html | 176 + .../api/modules/tokens_delimited_token_.html | 176 + zh-cn/api/modules/tokens_filter_token_.html | 176 + zh-cn/api/modules/tokens_hash_token_.html | 176 + zh-cn/api/modules/tokens_html_token_.html | 176 + .../api/modules/tokens_identifier_token_.html | 176 + zh-cn/api/modules/tokens_literal_token_.html | 176 + zh-cn/api/modules/tokens_number_token_.html | 176 + zh-cn/api/modules/tokens_operator_token_.html | 195 + zh-cn/api/modules/tokens_output_token_.html | 176 + .../tokens_property_access_token_.html | 176 + zh-cn/api/modules/tokens_quoted_token_.html | 176 + zh-cn/api/modules/tokens_range_token_.html | 176 + zh-cn/api/modules/tokens_tag_token_.html | 176 + zh-cn/api/modules/tokens_token_.html | 176 + zh-cn/api/modules/tokens_toplevel_token_.html | 178 + zh-cn/api/modules/tokens_value_token_.html | 178 + zh-cn/api/modules/types_.html | 176 + zh-cn/api/modules/util_assert_.html | 198 + zh-cn/api/modules/util_async_.html | 310 + zh-cn/api/modules/util_character_.html | 199 + zh-cn/api/modules/util_collection_.html | 209 + zh-cn/api/modules/util_error_.html | 213 + zh-cn/api/modules/util_literal_.html | 191 + zh-cn/api/modules/util_operator_trie_.html | 192 + zh-cn/api/modules/util_strftime_.html | 928 +++ zh-cn/api/modules/util_type_guards_.html | 379 + zh-cn/api/modules/util_underscore_.html | 706 ++ zh-cn/filters/abs.html | 197 + zh-cn/filters/append.html | 191 + zh-cn/filters/at_least.html | 190 + zh-cn/filters/at_most.html | 190 + zh-cn/filters/capitalize.html | 191 + zh-cn/filters/ceil.html | 203 + zh-cn/filters/compact.html | 192 + zh-cn/filters/concat.html | 189 + zh-cn/filters/date.html | 208 + zh-cn/filters/default.html | 199 + zh-cn/filters/divided_by.html | 194 + zh-cn/filters/downcase.html | 190 + zh-cn/filters/escape.html | 192 + zh-cn/filters/escape_once.html | 196 + zh-cn/filters/first.html | 193 + zh-cn/filters/floor.html | 203 + zh-cn/filters/join.html | 184 + zh-cn/filters/json.html | 184 + zh-cn/filters/last.html | 193 + zh-cn/filters/lstrip.html | 184 + zh-cn/filters/map.html | 185 + zh-cn/filters/minus.html | 196 + zh-cn/filters/modulo.html | 196 + zh-cn/filters/newline_to_br.html | 184 + zh-cn/filters/overview.html | 206 + zh-cn/filters/plus.html | 196 + zh-cn/filters/prepend.html | 191 + zh-cn/filters/remove.html | 184 + zh-cn/filters/remove_first.html | 184 + zh-cn/filters/replace.html | 184 + zh-cn/filters/replace_first.html | 184 + zh-cn/filters/reverse.html | 191 + zh-cn/filters/round.html | 196 + zh-cn/filters/rstrip.html | 184 + zh-cn/filters/size.html | 193 + zh-cn/filters/slice.html | 203 + zh-cn/filters/sort.html | 187 + zh-cn/filters/sort_natural.html | 187 + zh-cn/filters/split.html | 184 + zh-cn/filters/strip.html | 184 + zh-cn/filters/strip_html.html | 184 + zh-cn/filters/strip_newlines.html | 184 + zh-cn/filters/times.html | 196 + zh-cn/filters/truncate.html | 198 + zh-cn/filters/truncatewords.html | 198 + zh-cn/filters/uniq.html | 184 + zh-cn/filters/upcase.html | 190 + zh-cn/filters/url_decode.html | 184 + zh-cn/filters/url_encode.html | 190 + zh-cn/filters/where.html | 200 + zh-cn/index.html | 266 + zh-cn/playground.html | 149 + zh-cn/tags/assign.html | 191 + zh-cn/tags/capture.html | 191 + zh-cn/tags/case.html | 184 + zh-cn/tags/comment.html | 184 + zh-cn/tags/cycle.html | 196 + zh-cn/tags/decrement.html | 186 + zh-cn/tags/for.html | 249 + zh-cn/tags/if.html | 192 + zh-cn/tags/include.html | 195 + zh-cn/tags/increment.html | 193 + zh-cn/tags/layout.html | 203 + zh-cn/tags/overview.html | 212 + zh-cn/tags/raw.html | 184 + zh-cn/tags/render.html | 202 + zh-cn/tags/tablerow.html | 200 + zh-cn/tags/unless.html | 187 + zh-cn/tutorials/caching.html | 189 + zh-cn/tutorials/contribution-guidelines.html | 187 + zh-cn/tutorials/differences.html | 186 + zh-cn/tutorials/intro-to-liquid.html | 199 + zh-cn/tutorials/migrate-to-9.html | 197 + zh-cn/tutorials/operators.html | 187 + zh-cn/tutorials/options.html | 213 + zh-cn/tutorials/partials-and-layouts.html | 195 + zh-cn/tutorials/plugins.html | 192 + zh-cn/tutorials/register-filters-tags.html | 191 + zh-cn/tutorials/render-file.html | 217 + zh-cn/tutorials/setup.html | 208 + zh-cn/tutorials/truthy-and-falsy.html | 307 + zh-cn/tutorials/use-in-expressjs.html | 195 + zh-cn/tutorials/whitespace-control.html | 199 + 537 files changed, 124663 insertions(+) create mode 100644 CNAME create mode 100644 api/classes/cache_lru_.lru.html create mode 100644 api/classes/cache_lru_.node.html create mode 100644 api/classes/context_context_.context.html create mode 100644 api/classes/drop_blank_drop_.blankdrop.html create mode 100644 api/classes/drop_block_drop_.blockdrop.html create mode 100644 api/classes/drop_drop_.drop.html create mode 100644 api/classes/drop_empty_drop_.emptydrop.html create mode 100644 api/classes/drop_forloop_drop_.forloopdrop.html create mode 100644 api/classes/drop_null_drop_.nulldrop.html create mode 100644 api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html create mode 100644 api/classes/liquid_.liquid.html create mode 100644 api/classes/parser_parse_stream_.parsestream.html create mode 100644 api/classes/parser_parser_.parser.html create mode 100644 api/classes/parser_tokenizer_.tokenizer.html create mode 100644 api/classes/render_emitter_.emitter.html create mode 100644 api/classes/render_expression_.expression.html create mode 100644 api/classes/render_render_.render.html create mode 100644 api/classes/template_filter_filter_.filter.html create mode 100644 api/classes/template_filter_filter_map_.filtermap.html create mode 100644 api/classes/template_html_.html.html create mode 100644 api/classes/template_output_.output.html create mode 100644 api/classes/template_tag_hash_.hash.html create mode 100644 api/classes/template_tag_tag_.tag.html create mode 100644 api/classes/template_tag_tag_map_.tagmap.html create mode 100644 api/classes/template_template_impl_.templateimpl.html create mode 100644 api/classes/template_value_.value.html create mode 100644 api/classes/tokens_delimited_token_.delimitedtoken.html create mode 100644 api/classes/tokens_filter_token_.filtertoken.html create mode 100644 api/classes/tokens_hash_token_.hashtoken.html create mode 100644 api/classes/tokens_html_token_.htmltoken.html create mode 100644 api/classes/tokens_identifier_token_.identifiertoken.html create mode 100644 api/classes/tokens_literal_token_.literaltoken.html create mode 100644 api/classes/tokens_number_token_.numbertoken.html create mode 100644 api/classes/tokens_operator_token_.operatortoken.html create mode 100644 api/classes/tokens_output_token_.outputtoken.html create mode 100644 api/classes/tokens_property_access_token_.propertyaccesstoken.html create mode 100644 api/classes/tokens_quoted_token_.quotedtoken.html create mode 100644 api/classes/tokens_range_token_.rangetoken.html create mode 100644 api/classes/tokens_tag_token_.tagtoken.html create mode 100644 api/classes/tokens_token_.token.html create mode 100644 api/classes/util_error_.assertionerror.html create mode 100644 api/classes/util_error_.internalundefinedvariableerror.html create mode 100644 api/classes/util_error_.liquiderror.html create mode 100644 api/classes/util_error_.parseerror.html create mode 100644 api/classes/util_error_.rendererror.html create mode 100644 api/classes/util_error_.tokenizationerror.html create mode 100644 api/classes/util_error_.undefinedvariableerror.html create mode 100644 api/classes/util_strftime_.timezonedate.html create mode 100644 api/enums/context_block_mode_.blockmode.html create mode 100644 api/enums/parser_token_kind_.tokenkind.html create mode 100644 api/globals.html create mode 100644 api/interfaces/cache_cache_.cache.html create mode 100644 api/interfaces/context_scope_.plainobject.html create mode 100644 api/interfaces/drop_comparable_.comparable.html create mode 100644 api/interfaces/fs_fs_.fs.html create mode 100644 api/interfaces/liquid_options_.liquidoptions.html create mode 100644 api/interfaces/liquid_options_.normalizedfulloptions.html create mode 100644 api/interfaces/liquid_options_.normalizedoptions.html create mode 100644 api/interfaces/render_operator_.operators.html create mode 100644 api/interfaces/template_filter_filter_impl_.filterimpl.html create mode 100644 api/interfaces/template_filter_filter_impl_options_.filterimploptions.html create mode 100644 api/interfaces/template_tag_tag_impl_.tagimpl.html create mode 100644 api/interfaces/template_tag_tag_impl_options_.tagimploptions.html create mode 100644 api/interfaces/template_template_.template.html create mode 100644 api/interfaces/util_async_.thenable.html create mode 100644 api/interfaces/util_operator_trie_.trie.html create mode 100644 api/interfaces/util_strftime_.formatoptions.html create mode 100644 api/modules/builtin_filters_array_.html create mode 100644 api/modules/builtin_filters_date_.html create mode 100644 api/modules/builtin_filters_html_.html create mode 100644 api/modules/builtin_filters_index_.html create mode 100644 api/modules/builtin_filters_math_.html create mode 100644 api/modules/builtin_filters_object_.html create mode 100644 api/modules/builtin_filters_string_.html create mode 100644 api/modules/builtin_filters_url_.html create mode 100644 api/modules/builtin_tags_assign_.html create mode 100644 api/modules/builtin_tags_block_.html create mode 100644 api/modules/builtin_tags_break_.html create mode 100644 api/modules/builtin_tags_capture_.html create mode 100644 api/modules/builtin_tags_case_.html create mode 100644 api/modules/builtin_tags_comment_.html create mode 100644 api/modules/builtin_tags_continue_.html create mode 100644 api/modules/builtin_tags_cycle_.html create mode 100644 api/modules/builtin_tags_decrement_.html create mode 100644 api/modules/builtin_tags_for_.html create mode 100644 api/modules/builtin_tags_if_.html create mode 100644 api/modules/builtin_tags_include_.html create mode 100644 api/modules/builtin_tags_increment_.html create mode 100644 api/modules/builtin_tags_index_.html create mode 100644 api/modules/builtin_tags_layout_.html create mode 100644 api/modules/builtin_tags_raw_.html create mode 100644 api/modules/builtin_tags_render_.html create mode 100644 api/modules/builtin_tags_tablerow_.html create mode 100644 api/modules/builtin_tags_unless_.html create mode 100644 api/modules/cache_cache_.html create mode 100644 api/modules/cache_lru_.html create mode 100644 api/modules/context_block_mode_.html create mode 100644 api/modules/context_context_.html create mode 100644 api/modules/context_scope_.html create mode 100644 api/modules/drop_blank_drop_.html create mode 100644 api/modules/drop_block_drop_.html create mode 100644 api/modules/drop_comparable_.html create mode 100644 api/modules/drop_drop_.html create mode 100644 api/modules/drop_empty_drop_.html create mode 100644 api/modules/drop_forloop_drop_.html create mode 100644 api/modules/drop_null_drop_.html create mode 100644 api/modules/drop_tablerowloop_drop_.html create mode 100644 api/modules/fs_browser_.html create mode 100644 api/modules/fs_fs_.html create mode 100644 api/modules/fs_node_.html create mode 100644 api/modules/liquid_.html create mode 100644 api/modules/liquid_options_.html create mode 100644 api/modules/parser_filter_arg_.html create mode 100644 api/modules/parser_match_operator_.html create mode 100644 api/modules/parser_parse_stream_.html create mode 100644 api/modules/parser_parse_string_literal_.html create mode 100644 api/modules/parser_parser_.html create mode 100644 api/modules/parser_token_kind_.html create mode 100644 api/modules/parser_tokenizer_.html create mode 100644 api/modules/parser_whitespace_ctrl_.html create mode 100644 api/modules/render_boolean_.html create mode 100644 api/modules/render_emitter_.html create mode 100644 api/modules/render_expression_.html create mode 100644 api/modules/render_operator_.html create mode 100644 api/modules/render_render_.html create mode 100644 api/modules/template_filter_filter_.html create mode 100644 api/modules/template_filter_filter_impl_.html create mode 100644 api/modules/template_filter_filter_impl_options_.html create mode 100644 api/modules/template_filter_filter_map_.html create mode 100644 api/modules/template_html_.html create mode 100644 api/modules/template_output_.html create mode 100644 api/modules/template_tag_hash_.html create mode 100644 api/modules/template_tag_tag_.html create mode 100644 api/modules/template_tag_tag_impl_.html create mode 100644 api/modules/template_tag_tag_impl_options_.html create mode 100644 api/modules/template_tag_tag_map_.html create mode 100644 api/modules/template_template_.html create mode 100644 api/modules/template_template_impl_.html create mode 100644 api/modules/template_value_.html create mode 100644 api/modules/tokens_delimited_token_.html create mode 100644 api/modules/tokens_filter_token_.html create mode 100644 api/modules/tokens_hash_token_.html create mode 100644 api/modules/tokens_html_token_.html create mode 100644 api/modules/tokens_identifier_token_.html create mode 100644 api/modules/tokens_literal_token_.html create mode 100644 api/modules/tokens_number_token_.html create mode 100644 api/modules/tokens_operator_token_.html create mode 100644 api/modules/tokens_output_token_.html create mode 100644 api/modules/tokens_property_access_token_.html create mode 100644 api/modules/tokens_quoted_token_.html create mode 100644 api/modules/tokens_range_token_.html create mode 100644 api/modules/tokens_tag_token_.html create mode 100644 api/modules/tokens_token_.html create mode 100644 api/modules/tokens_toplevel_token_.html create mode 100644 api/modules/tokens_value_token_.html create mode 100644 api/modules/types_.html create mode 100644 api/modules/util_assert_.html create mode 100644 api/modules/util_async_.html create mode 100644 api/modules/util_character_.html create mode 100644 api/modules/util_collection_.html create mode 100644 api/modules/util_error_.html create mode 100644 api/modules/util_literal_.html create mode 100644 api/modules/util_operator_trie_.html create mode 100644 api/modules/util_strftime_.html create mode 100644 api/modules/util_type_guards_.html create mode 100644 api/modules/util_underscore_.html create mode 100644 assets/algolia/algoliasearch.js create mode 100644 assets/algolia/algoliasearch.min.js create mode 100644 assets/algolia/algoliasearchLite.js create mode 100644 assets/algolia/algoliasearchLite.min.js create mode 100644 browserconfig.xml create mode 100644 css/navy.css create mode 100644 favicon.ico create mode 100644 filters/abs.html create mode 100644 filters/append.html create mode 100644 filters/at_least.html create mode 100644 filters/at_most.html create mode 100644 filters/capitalize.html create mode 100644 filters/ceil.html create mode 100644 filters/compact.html create mode 100644 filters/concat.html create mode 100644 filters/date.html create mode 100644 filters/default.html create mode 100644 filters/divided_by.html create mode 100644 filters/downcase.html create mode 100644 filters/escape.html create mode 100644 filters/escape_once.html create mode 100644 filters/first.html create mode 100644 filters/floor.html create mode 100644 filters/join.html create mode 100644 filters/json.html create mode 100644 filters/last.html create mode 100644 filters/lstrip.html create mode 100644 filters/map.html create mode 100644 filters/minus.html create mode 100644 filters/modulo.html create mode 100644 filters/newline_to_br.html create mode 100644 filters/overview.html create mode 100644 filters/plus.html create mode 100644 filters/prepend.html create mode 100644 filters/remove.html create mode 100644 filters/remove_first.html create mode 100644 filters/replace.html create mode 100644 filters/replace_first.html create mode 100644 filters/reverse.html create mode 100644 filters/round.html create mode 100644 filters/rstrip.html create mode 100644 filters/size.html create mode 100644 filters/slice.html create mode 100644 filters/sort.html create mode 100644 filters/sort_natural.html create mode 100644 filters/split.html create mode 100644 filters/strip.html create mode 100644 filters/strip_html.html create mode 100644 filters/strip_newlines.html create mode 100644 filters/times.html create mode 100644 filters/truncate.html create mode 100644 filters/truncatewords.html create mode 100644 filters/uniq.html create mode 100644 filters/upcase.html create mode 100644 filters/url_decode.html create mode 100644 filters/url_encode.html create mode 100644 filters/where.html create mode 100644 fonts/icomoon.eot create mode 100644 fonts/icomoon.svg create mode 100644 fonts/icomoon.ttf create mode 100644 fonts/icomoon.woff create mode 100644 icon/apple-touch-icon-114x114.png create mode 100644 icon/apple-touch-icon-120x120.png create mode 100644 icon/apple-touch-icon-144x144.png create mode 100644 icon/apple-touch-icon-152x152.png create mode 100644 icon/apple-touch-icon-57x57.png create mode 100644 icon/apple-touch-icon-60x60.png create mode 100644 icon/apple-touch-icon-72x72.png create mode 100644 icon/apple-touch-icon-76x76.png create mode 100644 icon/apple-touch-icon-precomposed.png create mode 100644 icon/apple-touch-icon.png create mode 100644 icon/become_a_patron_button@2x.png create mode 100644 icon/favicon-160x160.png create mode 100644 icon/favicon-16x16.png create mode 100644 icon/favicon-196x196.png create mode 100644 icon/favicon-32x32.png create mode 100644 icon/favicon-96x96.png create mode 100644 icon/logo.png create mode 100644 icon/mstile-144x144.png create mode 100644 icon/mstile-150x150.png create mode 100644 icon/mstile-310x150.png create mode 100644 icon/mstile-310x310.png create mode 100644 icon/mstile-70x70.png create mode 100644 index.html create mode 100644 js/main.js create mode 100644 manifest.json create mode 100644 playground.html create mode 100644 robots.txt create mode 100644 sitemap.xml create mode 100644 sw.js create mode 100644 tags/assign.html create mode 100644 tags/capture.html create mode 100644 tags/case.html create mode 100644 tags/comment.html create mode 100644 tags/cycle.html create mode 100644 tags/decrement.html create mode 100644 tags/for.html create mode 100644 tags/if.html create mode 100644 tags/include.html create mode 100644 tags/increment.html create mode 100644 tags/layout.html create mode 100644 tags/overview.html create mode 100644 tags/raw.html create mode 100644 tags/render.html create mode 100644 tags/tablerow.html create mode 100644 tags/unless.html create mode 100644 tutorials/caching.html create mode 100644 tutorials/contribution-guidelines.html create mode 100644 tutorials/differences.html create mode 100644 tutorials/intro-to-liquid.html create mode 100644 tutorials/migrate-to-9.html create mode 100644 tutorials/operators.html create mode 100644 tutorials/options.html create mode 100644 tutorials/partials-and-layouts.html create mode 100644 tutorials/plugins.html create mode 100644 tutorials/register-filters-tags.html create mode 100644 tutorials/render-file.html create mode 100644 tutorials/setup.html create mode 100644 tutorials/truthy-and-falsy.html create mode 100644 tutorials/use-in-expressjs.html create mode 100644 tutorials/whitespace-control.html create mode 100644 zh-cn/api/classes/cache_lru_.lru.html create mode 100644 zh-cn/api/classes/cache_lru_.node.html create mode 100644 zh-cn/api/classes/context_context_.context.html create mode 100644 zh-cn/api/classes/drop_blank_drop_.blankdrop.html create mode 100644 zh-cn/api/classes/drop_block_drop_.blockdrop.html create mode 100644 zh-cn/api/classes/drop_drop_.drop.html create mode 100644 zh-cn/api/classes/drop_empty_drop_.emptydrop.html create mode 100644 zh-cn/api/classes/drop_forloop_drop_.forloopdrop.html create mode 100644 zh-cn/api/classes/drop_null_drop_.nulldrop.html create mode 100644 zh-cn/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html create mode 100644 zh-cn/api/classes/liquid_.liquid.html create mode 100644 zh-cn/api/classes/parser_parse_stream_.parsestream.html create mode 100644 zh-cn/api/classes/parser_parser_.parser.html create mode 100644 zh-cn/api/classes/parser_tokenizer_.tokenizer.html create mode 100644 zh-cn/api/classes/render_emitter_.emitter.html create mode 100644 zh-cn/api/classes/render_expression_.expression.html create mode 100644 zh-cn/api/classes/render_render_.render.html create mode 100644 zh-cn/api/classes/template_filter_filter_.filter.html create mode 100644 zh-cn/api/classes/template_filter_filter_map_.filtermap.html create mode 100644 zh-cn/api/classes/template_html_.html.html create mode 100644 zh-cn/api/classes/template_output_.output.html create mode 100644 zh-cn/api/classes/template_tag_hash_.hash.html create mode 100644 zh-cn/api/classes/template_tag_tag_.tag.html create mode 100644 zh-cn/api/classes/template_tag_tag_map_.tagmap.html create mode 100644 zh-cn/api/classes/template_template_impl_.templateimpl.html create mode 100644 zh-cn/api/classes/template_value_.value.html create mode 100644 zh-cn/api/classes/tokens_delimited_token_.delimitedtoken.html create mode 100644 zh-cn/api/classes/tokens_filter_token_.filtertoken.html create mode 100644 zh-cn/api/classes/tokens_hash_token_.hashtoken.html create mode 100644 zh-cn/api/classes/tokens_html_token_.htmltoken.html create mode 100644 zh-cn/api/classes/tokens_identifier_token_.identifiertoken.html create mode 100644 zh-cn/api/classes/tokens_literal_token_.literaltoken.html create mode 100644 zh-cn/api/classes/tokens_number_token_.numbertoken.html create mode 100644 zh-cn/api/classes/tokens_operator_token_.operatortoken.html create mode 100644 zh-cn/api/classes/tokens_output_token_.outputtoken.html create mode 100644 zh-cn/api/classes/tokens_property_access_token_.propertyaccesstoken.html create mode 100644 zh-cn/api/classes/tokens_quoted_token_.quotedtoken.html create mode 100644 zh-cn/api/classes/tokens_range_token_.rangetoken.html create mode 100644 zh-cn/api/classes/tokens_tag_token_.tagtoken.html create mode 100644 zh-cn/api/classes/tokens_token_.token.html create mode 100644 zh-cn/api/classes/util_error_.assertionerror.html create mode 100644 zh-cn/api/classes/util_error_.internalundefinedvariableerror.html create mode 100644 zh-cn/api/classes/util_error_.liquiderror.html create mode 100644 zh-cn/api/classes/util_error_.parseerror.html create mode 100644 zh-cn/api/classes/util_error_.rendererror.html create mode 100644 zh-cn/api/classes/util_error_.tokenizationerror.html create mode 100644 zh-cn/api/classes/util_error_.undefinedvariableerror.html create mode 100644 zh-cn/api/classes/util_strftime_.timezonedate.html create mode 100644 zh-cn/api/enums/context_block_mode_.blockmode.html create mode 100644 zh-cn/api/enums/parser_token_kind_.tokenkind.html create mode 100644 zh-cn/api/globals.html create mode 100644 zh-cn/api/interfaces/cache_cache_.cache.html create mode 100644 zh-cn/api/interfaces/context_scope_.plainobject.html create mode 100644 zh-cn/api/interfaces/drop_comparable_.comparable.html create mode 100644 zh-cn/api/interfaces/fs_fs_.fs.html create mode 100644 zh-cn/api/interfaces/liquid_options_.liquidoptions.html create mode 100644 zh-cn/api/interfaces/liquid_options_.normalizedfulloptions.html create mode 100644 zh-cn/api/interfaces/liquid_options_.normalizedoptions.html create mode 100644 zh-cn/api/interfaces/render_operator_.operators.html create mode 100644 zh-cn/api/interfaces/template_filter_filter_impl_.filterimpl.html create mode 100644 zh-cn/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html create mode 100644 zh-cn/api/interfaces/template_tag_tag_impl_.tagimpl.html create mode 100644 zh-cn/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html create mode 100644 zh-cn/api/interfaces/template_template_.template.html create mode 100644 zh-cn/api/interfaces/util_async_.thenable.html create mode 100644 zh-cn/api/interfaces/util_operator_trie_.trie.html create mode 100644 zh-cn/api/interfaces/util_strftime_.formatoptions.html create mode 100644 zh-cn/api/modules/builtin_filters_array_.html create mode 100644 zh-cn/api/modules/builtin_filters_date_.html create mode 100644 zh-cn/api/modules/builtin_filters_html_.html create mode 100644 zh-cn/api/modules/builtin_filters_index_.html create mode 100644 zh-cn/api/modules/builtin_filters_math_.html create mode 100644 zh-cn/api/modules/builtin_filters_object_.html create mode 100644 zh-cn/api/modules/builtin_filters_string_.html create mode 100644 zh-cn/api/modules/builtin_filters_url_.html create mode 100644 zh-cn/api/modules/builtin_tags_assign_.html create mode 100644 zh-cn/api/modules/builtin_tags_block_.html create mode 100644 zh-cn/api/modules/builtin_tags_break_.html create mode 100644 zh-cn/api/modules/builtin_tags_capture_.html create mode 100644 zh-cn/api/modules/builtin_tags_case_.html create mode 100644 zh-cn/api/modules/builtin_tags_comment_.html create mode 100644 zh-cn/api/modules/builtin_tags_continue_.html create mode 100644 zh-cn/api/modules/builtin_tags_cycle_.html create mode 100644 zh-cn/api/modules/builtin_tags_decrement_.html create mode 100644 zh-cn/api/modules/builtin_tags_for_.html create mode 100644 zh-cn/api/modules/builtin_tags_if_.html create mode 100644 zh-cn/api/modules/builtin_tags_include_.html create mode 100644 zh-cn/api/modules/builtin_tags_increment_.html create mode 100644 zh-cn/api/modules/builtin_tags_index_.html create mode 100644 zh-cn/api/modules/builtin_tags_layout_.html create mode 100644 zh-cn/api/modules/builtin_tags_raw_.html create mode 100644 zh-cn/api/modules/builtin_tags_render_.html create mode 100644 zh-cn/api/modules/builtin_tags_tablerow_.html create mode 100644 zh-cn/api/modules/builtin_tags_unless_.html create mode 100644 zh-cn/api/modules/cache_cache_.html create mode 100644 zh-cn/api/modules/cache_lru_.html create mode 100644 zh-cn/api/modules/context_block_mode_.html create mode 100644 zh-cn/api/modules/context_context_.html create mode 100644 zh-cn/api/modules/context_scope_.html create mode 100644 zh-cn/api/modules/drop_blank_drop_.html create mode 100644 zh-cn/api/modules/drop_block_drop_.html create mode 100644 zh-cn/api/modules/drop_comparable_.html create mode 100644 zh-cn/api/modules/drop_drop_.html create mode 100644 zh-cn/api/modules/drop_empty_drop_.html create mode 100644 zh-cn/api/modules/drop_forloop_drop_.html create mode 100644 zh-cn/api/modules/drop_null_drop_.html create mode 100644 zh-cn/api/modules/drop_tablerowloop_drop_.html create mode 100644 zh-cn/api/modules/fs_browser_.html create mode 100644 zh-cn/api/modules/fs_fs_.html create mode 100644 zh-cn/api/modules/fs_node_.html create mode 100644 zh-cn/api/modules/liquid_.html create mode 100644 zh-cn/api/modules/liquid_options_.html create mode 100644 zh-cn/api/modules/parser_filter_arg_.html create mode 100644 zh-cn/api/modules/parser_match_operator_.html create mode 100644 zh-cn/api/modules/parser_parse_stream_.html create mode 100644 zh-cn/api/modules/parser_parse_string_literal_.html create mode 100644 zh-cn/api/modules/parser_parser_.html create mode 100644 zh-cn/api/modules/parser_token_kind_.html create mode 100644 zh-cn/api/modules/parser_tokenizer_.html create mode 100644 zh-cn/api/modules/parser_whitespace_ctrl_.html create mode 100644 zh-cn/api/modules/render_boolean_.html create mode 100644 zh-cn/api/modules/render_emitter_.html create mode 100644 zh-cn/api/modules/render_expression_.html create mode 100644 zh-cn/api/modules/render_operator_.html create mode 100644 zh-cn/api/modules/render_render_.html create mode 100644 zh-cn/api/modules/template_filter_filter_.html create mode 100644 zh-cn/api/modules/template_filter_filter_impl_.html create mode 100644 zh-cn/api/modules/template_filter_filter_impl_options_.html create mode 100644 zh-cn/api/modules/template_filter_filter_map_.html create mode 100644 zh-cn/api/modules/template_html_.html create mode 100644 zh-cn/api/modules/template_output_.html create mode 100644 zh-cn/api/modules/template_tag_hash_.html create mode 100644 zh-cn/api/modules/template_tag_tag_.html create mode 100644 zh-cn/api/modules/template_tag_tag_impl_.html create mode 100644 zh-cn/api/modules/template_tag_tag_impl_options_.html create mode 100644 zh-cn/api/modules/template_tag_tag_map_.html create mode 100644 zh-cn/api/modules/template_template_.html create mode 100644 zh-cn/api/modules/template_template_impl_.html create mode 100644 zh-cn/api/modules/template_value_.html create mode 100644 zh-cn/api/modules/tokens_delimited_token_.html create mode 100644 zh-cn/api/modules/tokens_filter_token_.html create mode 100644 zh-cn/api/modules/tokens_hash_token_.html create mode 100644 zh-cn/api/modules/tokens_html_token_.html create mode 100644 zh-cn/api/modules/tokens_identifier_token_.html create mode 100644 zh-cn/api/modules/tokens_literal_token_.html create mode 100644 zh-cn/api/modules/tokens_number_token_.html create mode 100644 zh-cn/api/modules/tokens_operator_token_.html create mode 100644 zh-cn/api/modules/tokens_output_token_.html create mode 100644 zh-cn/api/modules/tokens_property_access_token_.html create mode 100644 zh-cn/api/modules/tokens_quoted_token_.html create mode 100644 zh-cn/api/modules/tokens_range_token_.html create mode 100644 zh-cn/api/modules/tokens_tag_token_.html create mode 100644 zh-cn/api/modules/tokens_token_.html create mode 100644 zh-cn/api/modules/tokens_toplevel_token_.html create mode 100644 zh-cn/api/modules/tokens_value_token_.html create mode 100644 zh-cn/api/modules/types_.html create mode 100644 zh-cn/api/modules/util_assert_.html create mode 100644 zh-cn/api/modules/util_async_.html create mode 100644 zh-cn/api/modules/util_character_.html create mode 100644 zh-cn/api/modules/util_collection_.html create mode 100644 zh-cn/api/modules/util_error_.html create mode 100644 zh-cn/api/modules/util_literal_.html create mode 100644 zh-cn/api/modules/util_operator_trie_.html create mode 100644 zh-cn/api/modules/util_strftime_.html create mode 100644 zh-cn/api/modules/util_type_guards_.html create mode 100644 zh-cn/api/modules/util_underscore_.html create mode 100644 zh-cn/filters/abs.html create mode 100644 zh-cn/filters/append.html create mode 100644 zh-cn/filters/at_least.html create mode 100644 zh-cn/filters/at_most.html create mode 100644 zh-cn/filters/capitalize.html create mode 100644 zh-cn/filters/ceil.html create mode 100644 zh-cn/filters/compact.html create mode 100644 zh-cn/filters/concat.html create mode 100644 zh-cn/filters/date.html create mode 100644 zh-cn/filters/default.html create mode 100644 zh-cn/filters/divided_by.html create mode 100644 zh-cn/filters/downcase.html create mode 100644 zh-cn/filters/escape.html create mode 100644 zh-cn/filters/escape_once.html create mode 100644 zh-cn/filters/first.html create mode 100644 zh-cn/filters/floor.html create mode 100644 zh-cn/filters/join.html create mode 100644 zh-cn/filters/json.html create mode 100644 zh-cn/filters/last.html create mode 100644 zh-cn/filters/lstrip.html create mode 100644 zh-cn/filters/map.html create mode 100644 zh-cn/filters/minus.html create mode 100644 zh-cn/filters/modulo.html create mode 100644 zh-cn/filters/newline_to_br.html create mode 100644 zh-cn/filters/overview.html create mode 100644 zh-cn/filters/plus.html create mode 100644 zh-cn/filters/prepend.html create mode 100644 zh-cn/filters/remove.html create mode 100644 zh-cn/filters/remove_first.html create mode 100644 zh-cn/filters/replace.html create mode 100644 zh-cn/filters/replace_first.html create mode 100644 zh-cn/filters/reverse.html create mode 100644 zh-cn/filters/round.html create mode 100644 zh-cn/filters/rstrip.html create mode 100644 zh-cn/filters/size.html create mode 100644 zh-cn/filters/slice.html create mode 100644 zh-cn/filters/sort.html create mode 100644 zh-cn/filters/sort_natural.html create mode 100644 zh-cn/filters/split.html create mode 100644 zh-cn/filters/strip.html create mode 100644 zh-cn/filters/strip_html.html create mode 100644 zh-cn/filters/strip_newlines.html create mode 100644 zh-cn/filters/times.html create mode 100644 zh-cn/filters/truncate.html create mode 100644 zh-cn/filters/truncatewords.html create mode 100644 zh-cn/filters/uniq.html create mode 100644 zh-cn/filters/upcase.html create mode 100644 zh-cn/filters/url_decode.html create mode 100644 zh-cn/filters/url_encode.html create mode 100644 zh-cn/filters/where.html create mode 100644 zh-cn/index.html create mode 100644 zh-cn/playground.html create mode 100644 zh-cn/tags/assign.html create mode 100644 zh-cn/tags/capture.html create mode 100644 zh-cn/tags/case.html create mode 100644 zh-cn/tags/comment.html create mode 100644 zh-cn/tags/cycle.html create mode 100644 zh-cn/tags/decrement.html create mode 100644 zh-cn/tags/for.html create mode 100644 zh-cn/tags/if.html create mode 100644 zh-cn/tags/include.html create mode 100644 zh-cn/tags/increment.html create mode 100644 zh-cn/tags/layout.html create mode 100644 zh-cn/tags/overview.html create mode 100644 zh-cn/tags/raw.html create mode 100644 zh-cn/tags/render.html create mode 100644 zh-cn/tags/tablerow.html create mode 100644 zh-cn/tags/unless.html create mode 100644 zh-cn/tutorials/caching.html create mode 100644 zh-cn/tutorials/contribution-guidelines.html create mode 100644 zh-cn/tutorials/differences.html create mode 100644 zh-cn/tutorials/intro-to-liquid.html create mode 100644 zh-cn/tutorials/migrate-to-9.html create mode 100644 zh-cn/tutorials/operators.html create mode 100644 zh-cn/tutorials/options.html create mode 100644 zh-cn/tutorials/partials-and-layouts.html create mode 100644 zh-cn/tutorials/plugins.html create mode 100644 zh-cn/tutorials/register-filters-tags.html create mode 100644 zh-cn/tutorials/render-file.html create mode 100644 zh-cn/tutorials/setup.html create mode 100644 zh-cn/tutorials/truthy-and-falsy.html create mode 100644 zh-cn/tutorials/use-in-expressjs.html create mode 100644 zh-cn/tutorials/whitespace-control.html diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..51d1ac018 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +liquidjs.com \ No newline at end of file diff --git a/api/classes/cache_lru_.lru.html b/api/classes/cache_lru_.lru.html new file mode 100644 index 000000000..e0fb977c5 --- /dev/null +++ b/api/classes/cache_lru_.lru.html @@ -0,0 +1,287 @@ + + + + + Class: LRU <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LRU <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • LRU
  • +
+

Implements

+

Constructors

constructor

+ new LRU(limit: number, size: number): LRU

+

Defined in cache/lru.ts:15

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
limitnumber-
sizenumber0
+

Returns: LRU

+

Properties

Private cache

cache: object

+

Defined in cache/lru.ts:13

+

Type declaration:

    +
  • [ key: string]: Node‹T›
  • +
+
+

Private head

head: Node‹T›

+

Defined in cache/lru.ts:14

+
+

limit

limit: number

+

Defined in cache/lru.ts:18

+
+

size

size: number

+

Defined in cache/lru.ts:19

+
+

Private tail

tail: Node‹T›

+

Defined in cache/lru.ts:15

+

Methods

clear

clear(): void

+

Defined in cache/lru.ts:57

+

Returns: void

+
+

Private ensureLimit

ensureLimit(): void

+

Defined in cache/lru.ts:64

+

Returns: void

+
+

read

read(key: string): T | undefined

+

Implementation of Cache

+

Defined in cache/lru.ts:41

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: T | undefined

+
+

remove

remove(key: string): void

+

Defined in cache/lru.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: void

+
+

write

write(key: string, value: T): void

+

Implementation of Cache

+

Defined in cache/lru.ts:27

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueT
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/cache_lru_.node.html b/api/classes/cache_lru_.node.html new file mode 100644 index 000000000..c4f6d3a40 --- /dev/null +++ b/api/classes/cache_lru_.node.html @@ -0,0 +1,219 @@ + + + + + Class: Node <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Node <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • Node
  • +
+

Constructors

constructor

+ new Node(key: string, value: T, next: Node‹T›, prev: Node‹T›): Node

+

Defined in cache/lru.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
keystring
valueT
nextNode‹T›
prevNode‹T›
+

Returns: Node

+

Properties

key

key: string

+

Defined in cache/lru.ts:5

+
+

next

next: Node‹T›

+

Defined in cache/lru.ts:7

+
+

prev

prev: Node‹T›

+

Defined in cache/lru.ts:8

+
+

value

value: T

+

Defined in cache/lru.ts:6

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/context_context_.context.html b/api/classes/context_context_.context.html new file mode 100644 index 000000000..87965f633 --- /dev/null +++ b/api/classes/context_context_.context.html @@ -0,0 +1,386 @@ + + + + + Class: Context | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Context

+ + + +
+
+

Hierarchy

    +
  • Context
  • +
+

Constructors

constructor

+ new Context(env: object, opts: NormalizedFullOptions, sync: boolean): Context

+

Defined in context/context.ts:14

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
envobject{}
optsNormalizedFullOptionsdefaultOptions
syncbooleanfalse
+

Returns: Context

+

Properties

environments

environments: Scope

+

Defined in context/context.ts:11

+
+

globals

globals: Scope

+

Defined in context/context.ts:12

+
+

opts

opts: NormalizedFullOptions

+

Defined in context/context.ts:14

+
+

Private registers

registers: object

+

Defined in context/context.ts:10

+

Type declaration:


+

Private scopes

scopes: Scope[] = [{}]

+

Defined in context/context.ts:9

+
+

sync

sync: boolean

+

Defined in context/context.ts:13

+

Methods

bottom

bottom(): PlainObject | Drop

+

Defined in context/context.ts:57

+

Returns: PlainObject | Drop

+
+

Private findScope

findScope(key: string): PlainObject | Drop

+

Defined in context/context.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: PlainObject | Drop

+
+

get

get(paths: string[]): object

+

Defined in context/context.ts:37

+

Parameters:

+ + + + + + + + + + + +
NameType
pathsstring[]
+

Returns: object

+
+

getAll

getAll(): PlainObject | Drop

+

Defined in context/context.ts:33

+

Returns: PlainObject | Drop

+
+

getFromScope

getFromScope(scope: object, paths: string[] | string): object

+

Defined in context/context.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
scopeobject
pathsstring[] | string
+

Returns: object

+
+

getRegister

getRegister(key: string, defaultValue: object): any

+

Defined in context/context.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
keystring-
defaultValueobject{}
+

Returns: any

+
+

pop

pop(): undefined | PlainObject | Drop

+

Defined in context/context.ts:54

+

Returns: undefined | PlainObject | Drop

+
+

push

push(ctx: object): number

+

Defined in context/context.ts:51

+

Parameters:

+ + + + + + + + + + + +
NameType
ctxobject
+

Returns: number

+
+

restoreRegister

restoreRegister(keyValues: [string, any][]): void

+

Defined in context/context.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
keyValues[string, any][]
+

Returns: void

+
+

saveRegister

saveRegister(…keys: string[]): [string, any][]

+

Defined in context/context.ts:27

+

Parameters:

+ + + + + + + + + + + +
NameType
...keysstring[]
+

Returns: [string, any][]

+
+

setRegister

setRegister(key: string, value: any): any

+

Defined in context/context.ts:24

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueany
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_blank_drop_.blankdrop.html b/api/classes/drop_blank_drop_.blankdrop.html new file mode 100644 index 000000000..30121f87f --- /dev/null +++ b/api/classes/drop_blank_drop_.blankdrop.html @@ -0,0 +1,242 @@ + + + + + Class: BlankDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: BlankDrop

+ + + +
+
+

Hierarchy

EmptyDrop

+

BlankDrop

+

Implements

+

Methods

equals

equals(value: any): boolean

+

Overrides EmptyDrop.equals

+

Defined in drop/blank-drop.ts:5

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Inherited from EmptyDrop.geq

+

Defined in drop/empty-drop.ts:16

+

Returns: boolean

+
+

gt

gt(): boolean

+

Inherited from EmptyDrop.gt

+

Defined in drop/empty-drop.ts:13

+

Returns: boolean

+
+

leq

leq(): boolean

+

Inherited from EmptyDrop.leq

+

Defined in drop/empty-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Inherited from EmptyDrop.lt

+

Defined in drop/empty-drop.ts:19

+

Returns: boolean

+
+

valueOf

valueOf(): string

+

Inherited from EmptyDrop.valueOf

+

Overrides Drop.valueOf

+

Defined in drop/empty-drop.ts:25

+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_block_drop_.blockdrop.html b/api/classes/drop_block_drop_.blockdrop.html new file mode 100644 index 000000000..5113dddc3 --- /dev/null +++ b/api/classes/drop_block_drop_.blockdrop.html @@ -0,0 +1,216 @@ + + + + + Class: BlockDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: BlockDrop

+ + + +
+
+

Hierarchy

    +
  • Drop

    +

    BlockDrop

    +
  • +
+

Constructors

constructor

+ new BlockDrop(superBlockRender: function): BlockDrop

+

Defined in drop/block-drop.ts:3

+

Parameters:

+

Default value superBlockRender: function= () => ‘’

+

▸ (): Iterable‹string›

+

Returns: BlockDrop

+

Properties

Private superBlockRender

superBlockRender: function

+

Defined in drop/block-drop.ts:6

+

Type declaration:

▸ (): Iterable‹string›

+

Methods

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

super

super(): Iterable‹string›

+

Defined in drop/block-drop.ts:10

+

Returns: Iterable‹string›

+
+

valueOf

valueOf(): any

+

Inherited from Drop.valueOf

+

Defined in drop/drop.ts:2

+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_drop_.drop.html b/api/classes/drop_drop_.drop.html new file mode 100644 index 000000000..02cda09e5 --- /dev/null +++ b/api/classes/drop_drop_.drop.html @@ -0,0 +1,204 @@ + + + + + Class: Drop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Drop

+ + + +
+
+

Hierarchy

+

Methods

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

valueOf

valueOf(): any

+

Defined in drop/drop.ts:2

+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_empty_drop_.emptydrop.html b/api/classes/drop_empty_drop_.emptydrop.html new file mode 100644 index 000000000..f30c886e6 --- /dev/null +++ b/api/classes/drop_empty_drop_.emptydrop.html @@ -0,0 +1,240 @@ + + + + + Class: EmptyDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: EmptyDrop

+ + + +
+
+

Hierarchy

+

Implements

+

Methods

equals

equals(value: any): boolean

+

Defined in drop/empty-drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Defined in drop/empty-drop.ts:16

+

Returns: boolean

+
+

gt

gt(): boolean

+

Defined in drop/empty-drop.ts:13

+

Returns: boolean

+
+

leq

leq(): boolean

+

Defined in drop/empty-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Defined in drop/empty-drop.ts:19

+

Returns: boolean

+
+

valueOf

valueOf(): string

+

Overrides Drop.valueOf

+

Defined in drop/empty-drop.ts:25

+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_forloop_drop_.forloopdrop.html b/api/classes/drop_forloop_drop_.forloopdrop.html new file mode 100644 index 000000000..25d0815b4 --- /dev/null +++ b/api/classes/drop_forloop_drop_.forloopdrop.html @@ -0,0 +1,253 @@ + + + + + Class: ForloopDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ForloopDrop

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new ForloopDrop(length: number): ForloopDrop

+

Defined in drop/forloop-drop.ts:5

+

Parameters:

+ + + + + + + + + + + +
NameType
lengthnumber
+

Returns: ForloopDrop

+

Properties

Protected i

i: number = 0

+

Defined in drop/forloop-drop.ts:4

+
+

length

length: number

+

Defined in drop/forloop-drop.ts:5

+

Methods

first

first(): boolean

+

Defined in drop/forloop-drop.ts:19

+

Returns: boolean

+
+

index

index(): number

+

Defined in drop/forloop-drop.ts:16

+

Returns: number

+
+

index0

index0(): number

+

Defined in drop/forloop-drop.ts:13

+

Returns: number

+
+

last

last(): boolean

+

Defined in drop/forloop-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

next

next(): void

+

Defined in drop/forloop-drop.ts:10

+

Returns: void

+
+

rindex

rindex(): number

+

Defined in drop/forloop-drop.ts:25

+

Returns: number

+
+

rindex0

rindex0(): number

+

Defined in drop/forloop-drop.ts:28

+

Returns: number

+
+

valueOf

valueOf(): string

+

Overrides Drop.valueOf

+

Defined in drop/forloop-drop.ts:31

+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_null_drop_.nulldrop.html b/api/classes/drop_null_drop_.nulldrop.html new file mode 100644 index 000000000..3138c0117 --- /dev/null +++ b/api/classes/drop_null_drop_.nulldrop.html @@ -0,0 +1,239 @@ + + + + + Class: NullDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: NullDrop

+ + + +
+
+

Hierarchy

    +
  • Drop

    +

    NullDrop

    +
  • +
+

Implements

+

Methods

equals

equals(value: any): boolean

+

Defined in drop/null-drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Defined in drop/null-drop.ts:12

+

Returns: boolean

+
+

gt

gt(): boolean

+

Defined in drop/null-drop.ts:9

+

Returns: boolean

+
+

leq

leq(): boolean

+

Defined in drop/null-drop.ts:18

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Defined in drop/null-drop.ts:15

+

Returns: boolean

+
+

valueOf

valueOf(): null

+

Overrides Drop.valueOf

+

Defined in drop/null-drop.ts:21

+

Returns: null

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html b/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html new file mode 100644 index 000000000..6154d6fee --- /dev/null +++ b/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html @@ -0,0 +1,287 @@ + + + + + Class: TablerowloopDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TablerowloopDrop

+ + + +
+
+

Hierarchy

ForloopDrop

+

TablerowloopDrop

+

Constructors

constructor

+ new TablerowloopDrop(length: number, cols: number): TablerowloopDrop

+

Overrides ForloopDrop.constructor

+

Defined in drop/tablerowloop-drop.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lengthnumber
colsnumber
+

Returns: TablerowloopDrop

+

Properties

Private cols

cols: number

+

Defined in drop/tablerowloop-drop.ts:4

+
+

Protected i

i: number = 0

+

Inherited from ForloopDrop.i

+

Defined in drop/forloop-drop.ts:4

+
+

length

length: number

+

Inherited from ForloopDrop.length

+

Defined in drop/forloop-drop.ts:5

+

Methods

col

col(): number

+

Defined in drop/tablerowloop-drop.ts:16

+

Returns: number

+
+

col0

col0(): number

+

Defined in drop/tablerowloop-drop.ts:13

+

Returns: number

+
+

col_first

col_first(): boolean

+

Defined in drop/tablerowloop-drop.ts:19

+

Returns: boolean

+
+

col_last

col_last(): boolean

+

Defined in drop/tablerowloop-drop.ts:22

+

Returns: boolean

+
+

first

first(): boolean

+

Inherited from ForloopDrop.first

+

Defined in drop/forloop-drop.ts:19

+

Returns: boolean

+
+

index

index(): number

+

Inherited from ForloopDrop.index

+

Defined in drop/forloop-drop.ts:16

+

Returns: number

+
+

index0

index0(): number

+

Inherited from ForloopDrop.index0

+

Defined in drop/forloop-drop.ts:13

+

Returns: number

+
+

last

last(): boolean

+

Inherited from ForloopDrop.last

+

Defined in drop/forloop-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

next

next(): void

+

Inherited from ForloopDrop.next

+

Defined in drop/forloop-drop.ts:10

+

Returns: void

+
+

rindex

rindex(): number

+

Inherited from ForloopDrop.rindex

+

Defined in drop/forloop-drop.ts:25

+

Returns: number

+
+

rindex0

rindex0(): number

+

Inherited from ForloopDrop.rindex0

+

Defined in drop/forloop-drop.ts:28

+

Returns: number

+
+

row

row(): number

+

Defined in drop/tablerowloop-drop.ts:10

+

Returns: number

+
+

valueOf

valueOf(): string

+

Inherited from ForloopDrop.valueOf

+

Overrides Drop.valueOf

+

Defined in drop/forloop-drop.ts:31

+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/liquid_.liquid.html b/api/classes/liquid_.liquid.html new file mode 100644 index 000000000..455ef82f9 --- /dev/null +++ b/api/classes/liquid_.liquid.html @@ -0,0 +1,702 @@ + + + + + Class: Liquid | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Liquid

+ + + +
+
+

Hierarchy

    +
  • Liquid
  • +
+

Constructors

constructor

+ new Liquid(opts: LiquidOptions): Liquid

+

Defined in liquid.ts:26

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optsLiquidOptions{}
+

Returns: Liquid

+

Properties

filters

filters: FilterMap

+

Defined in liquid.ts:25

+
+

options

options: NormalizedFullOptions

+

Defined in liquid.ts:22

+
+

parser

parser: Parser

+

Defined in liquid.ts:24

+
+

renderer

renderer: Render

+

Defined in liquid.ts:23

+
+

tags

tags: TagMap

+

Defined in liquid.ts:26

+

Methods

_evalValue

_evalValue(str: string, ctx: Context): IterableIterator‹any›

+

Defined in liquid.ts:104

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: IterableIterator‹any›

+
+

_parseAndRender

_parseAndRender(html: string, scope?: undefined | object, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:57

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

_parseFile

_parseFile(file: string, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:68

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

_render

_render(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:44

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

evalValue

evalValue(str: string, ctx: Context): Promise‹any›

+

Defined in liquid.ts:108

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: Promise‹any›

+
+

evalValueSync

evalValueSync(str: string, ctx: Context): any

+

Defined in liquid.ts:111

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: any

+
+

express

express(): (Anonymous function)

+

Defined in liquid.ts:124

+

Returns: (Anonymous function)

+
+

getTemplate

getTemplate(file: string, opts?: LiquidOptions): Promise‹Template[]›

+

Defined in liquid.ts:142

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Promise‹Template[]›

+
+

getTemplateSync

getTemplateSync(file: string, opts?: LiquidOptions): Template[]

+

Defined in liquid.ts:148

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Template[]

+
+

Private lookupError

lookupError(file: string, roots: string[]): any

+

Defined in liquid.ts:132

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
rootsstring[]
+

Returns: any

+
+

parse

parse(html: string, filepath?: undefined | string): Template[]

+

Defined in liquid.ts:38

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
htmlstring
filepath?undefined | string
+

Returns: Template[]

+
+

parseAndRender

parseAndRender(html: string, scope?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:61

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

parseAndRenderSync

parseAndRenderSync(html: string, scope?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:64

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
+

Returns: any

+
+

parseFile

parseFile(file: string, opts?: LiquidOptions): Promise‹Template[]›

+

Defined in liquid.ts:89

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Promise‹Template[]›

+
+

parseFileSync

parseFileSync(file: string, opts?: LiquidOptions): Template[]

+

Defined in liquid.ts:92

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Template[]

+
+

plugin

plugin(plugin: function): void

+

Defined in liquid.ts:121

+

Parameters:

+

plugin: function

+

▸ (this: Liquid, L: Liquid): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
thisLiquid
LLiquid
+

Returns: void

+
+

registerFilter

registerFilter(name: string, filter: FilterImplOptions): void

+

Defined in liquid.ts:115

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
filterFilterImplOptions
+

Returns: void

+
+

registerTag

registerTag(name: string, tag: TagImplOptions): void

+

Defined in liquid.ts:118

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
tagTagImplOptions
+

Returns: void

+
+

render

render(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:50

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

renderFile

renderFile(file: string, ctx?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:95

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
ctx?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

renderFileSync

renderFileSync(file: string, ctx?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:99

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
ctx?undefined | object
opts?LiquidOptions
+

Returns: any

+
+

renderSync

renderSync(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:53

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/parser_parse_stream_.parsestream.html b/api/classes/parser_parse_stream_.parsestream.html new file mode 100644 index 000000000..4c314172d --- /dev/null +++ b/api/classes/parser_parse_stream_.parsestream.html @@ -0,0 +1,281 @@ + + + + + Class: ParseStream <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ParseStream <T>

+ + + +
+
+

Type parameters

T: Token

+

Hierarchy

    +
  • ParseStream
  • +
+

Constructors

constructor

+ new ParseStream(tokens: T[], parseToken: ParseToken‹T›): ParseStream

+

Defined in parser/parse-stream.ts:12

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokensT[]
parseTokenParseToken‹T›
+

Returns: ParseStream

+

Properties

Private handlers

handlers: object

+

Defined in parser/parse-stream.ts:10

+

Type declaration:

    +
  • [ key: string]: function
  • +
+

▸ (arg: any): void

+

Parameters:

+ + + + + + + + + + + +
NameType
argany
+
+

Private parseToken

parseToken: ParseToken‹T›

+

Defined in parser/parse-stream.ts:12

+
+

Private stopRequested

stopRequested: boolean = false

+

Defined in parser/parse-stream.ts:11

+
+

Private tokens

tokens: T[]

+

Defined in parser/parse-stream.ts:9

+

Methods

on

on<T2>(name: string, cb: function): ParseStream‹T›

+

Defined in parser/parse-stream.ts:18

+

Type parameters:

+

T2: Template | T | undefined

+

Parameters:

+

name: string

+

cb: function

+

▸ (arg: T2): void

+

Parameters:

+ + + + + + + + + + + +
NameType
argT2
+

Returns: ParseStream‹T›

+
+

start

start(): this

+

Defined in parser/parse-stream.ts:26

+

Returns: this

+
+

stop

stop(): this

+

Defined in parser/parse-stream.ts:40

+

Returns: this

+
+

Private trigger

trigger<T>(event: string, arg?: T): boolean

+

Defined in parser/parse-stream.ts:22

+

Type parameters:

+

T: Token | Template

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
eventstring
arg?T
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/parser_parser_.parser.html b/api/classes/parser_parser_.parser.html new file mode 100644 index 000000000..402e68533 --- /dev/null +++ b/api/classes/parser_parser_.parser.html @@ -0,0 +1,251 @@ + + + + + Class: Parser | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Parser

+ + + +
+
+

Hierarchy

    +
  • Parser
  • +
+

Constructors

constructor

+ new Parser(liquid: Liquid): Parser

+

Defined in parser/parser.ts:13

+

Parameters:

+ + + + + + + + + + + +
NameType
liquidLiquid
+

Returns: Parser

+

Properties

Private liquid

liquid: Liquid

+

Defined in parser/parser.ts:13

+

Methods

parse

parse(tokens: TopLevelToken[]): Template[]

+

Defined in parser/parser.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensTopLevelToken[]
+

Returns: Template[]

+
+

parseStream

parseStream(tokens: TopLevelToken[]): ParseStreamTagToken | HTMLToken | OutputToken

+

Defined in parser/parser.ts:39

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensTopLevelToken[]
+

Returns: ParseStreamTagToken | HTMLToken | OutputToken

+
+

parseToken

parseToken(token: TopLevelToken, remainTokens: TopLevelToken[]): Tag | Output | HTML

+

Defined in parser/parser.ts:26

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenTopLevelToken
remainTokensTopLevelToken[]
+

Returns: Tag | Output | HTML

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/parser_tokenizer_.tokenizer.html b/api/classes/parser_tokenizer_.tokenizer.html new file mode 100644 index 000000000..c3a29457a --- /dev/null +++ b/api/classes/parser_tokenizer_.tokenizer.html @@ -0,0 +1,568 @@ + + + + + Class: Tokenizer | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Tokenizer

+ + + +
+
+

Hierarchy

    +
  • Tokenizer
  • +
+

Constructors

constructor

+ new Tokenizer(input: string, trie: Trie, file: string): Tokenizer

+

Defined in parser/tokenizer.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
inputstring-
trieTrie-
filestring“”
+

Returns: Tokenizer

+

Properties

N

N: number

+

Defined in parser/tokenizer.ts:30

+
+

Private file

file: string

+

Defined in parser/tokenizer.ts:36

+
+

Private input

input: string

+

Defined in parser/tokenizer.ts:34

+
+

p

p: number = 0

+

Defined in parser/tokenizer.ts:29

+
+

Private rawBeginAt

rawBeginAt: number = -1

+

Defined in parser/tokenizer.ts:31

+
+

Private trie

trie: Trie

+

Defined in parser/tokenizer.ts:35

+

Methods

advance

advance(i: number): void

+

Defined in parser/tokenizer.ts:248

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
inumber1
+

Returns: void

+
+

end

end(): boolean

+

Defined in parser/tokenizer.ts:252

+

Returns: boolean

+
+

match

match(word: string): boolean

+

Defined in parser/tokenizer.ts:343

+

Parameters:

+ + + + + + + + + + + +
NameType
wordstring
+

Returns: boolean

+
+

mkError

mkError(msg: string, begin: number): TokenizationError

+

Defined in parser/tokenizer.ts:196

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
msgstring
beginnumber
+

Returns: TokenizationError

+
+

peek

peek(n: number): string

+

Defined in parser/tokenizer.ts:361

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
nnumber0
+

Returns: string

+
+

peekType

peekType(n: number): number

+

Defined in parser/tokenizer.ts:357

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
nnumber0
+

Returns: number

+
+

readEndrawOrRawContent

readEndrawOrRawContent(options: NormalizedFullOptions): HTMLToken | TagToken

+

Defined in parser/tokenizer.ts:169

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: HTMLToken | TagToken

+
+

readExpression

readExpression(): Expression

+

Defined in parser/tokenizer.ts:41

+

Returns: Expression

+
+

readExpressionTokens

readExpressionTokens(): IterableIterator‹Token

+

Defined in parser/tokenizer.ts:45

+

Returns: IterableIterator‹Token

+
+

readFileName

readFileName(): IdentifierToken

+

Defined in parser/tokenizer.ts:337

+

Returns: IdentifierToken

+
+

readFilter

readFilter(): FilterToken | null

+

Defined in parser/tokenizer.ts:76

+

Returns: FilterToken | null

+
+

readFilterArg

readFilterArg(): FilterArg | undefined

+

Defined in parser/tokenizer.ts:97

+

Returns: FilterArg | undefined

+
+

readFilters

readFilters(): FilterToken[]

+

Defined in parser/tokenizer.ts:68

+

Returns: FilterToken[]

+
+

readHTMLToken

readHTMLToken(options: NormalizedFullOptions): HTMLToken

+

Defined in parser/tokenizer.ts:125

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: HTMLToken

+
+

readHash

readHash(): HashToken | undefined

+

Defined in parser/tokenizer.ts:228

+

Returns: HashToken | undefined

+
+

readHashes

readHashes(): HashToken[]

+

Defined in parser/tokenizer.ts:219

+

Returns: HashToken[]

+
+

readIdentifier

readIdentifier(): IdentifierToken

+

Defined in parser/tokenizer.ts:212

+

Returns: IdentifierToken

+
+

readOperator

readOperator(): OperatorToken | undefined

+

Defined in parser/tokenizer.ts:62

+

Returns: OperatorToken | undefined

+
+

readOutputToken

readOutputToken(options: NormalizedFullOptions): OutputToken

+

Defined in parser/tokenizer.ts:159

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: OutputToken

+
+

readQuoted

readQuoted(): QuotedToken | undefined

+

Defined in parser/tokenizer.ts:322

+

Returns: QuotedToken | undefined

+
+

readRange

readRange(): RangeToken | undefined

+

Defined in parser/tokenizer.ts:304

+

Returns: RangeToken | undefined

+
+

readTagToken

readTagToken(options: NormalizedFullOptions): TagToken

+

Defined in parser/tokenizer.ts:136

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: TagToken

+
+

readTo

readTo(end: string): number

+

Defined in parser/tokenizer.ts:256

+

Parameters:

+ + + + + + + + + + + +
NameType
endstring
+

Returns: number

+
+

readToDelimiter

readToDelimiter(delimiter: string): number

+

Defined in parser/tokenizer.ts:147

+

Parameters:

+ + + + + + + + + + + +
NameType
delimiterstring
+

Returns: number

+
+

readTopLevelToken

readTopLevelToken(options: NormalizedFullOptions): TopLevelToken

+

Defined in parser/tokenizer.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: TopLevelToken

+
+

readTopLevelTokens

readTopLevelTokens(options: NormalizedFullOptions): TopLevelToken[]

+

Defined in parser/tokenizer.ts:107

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: TopLevelToken[]

+
+

readValue

readValue(): ValueToken | undefined

+

Defined in parser/tokenizer.ts:264

+

Returns: ValueToken | undefined

+
+

readValueOrThrow

readValueOrThrow(): ValueToken

+

Defined in parser/tokenizer.ts:316

+

Returns: ValueToken

+
+

readWord

readWord(): IdentifierToken

+

Defined in parser/tokenizer.ts:207

+

Returns: IdentifierToken

+
+

remaining

remaining(): string

+

Defined in parser/tokenizer.ts:244

+

Returns: string

+
+

rmatch

rmatch(pattern: string): boolean

+

Defined in parser/tokenizer.ts:350

+

Parameters:

+ + + + + + + + + + + +
NameType
patternstring
+

Returns: boolean

+
+

skipBlank

skipBlank(): void

+

Defined in parser/tokenizer.ts:365

+

Returns: void

+
+

snapshot

snapshot(begin: number): string

+

Defined in parser/tokenizer.ts:200

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
beginnumberthis.p
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/render_emitter_.emitter.html b/api/classes/render_emitter_.emitter.html new file mode 100644 index 000000000..2283bac07 --- /dev/null +++ b/api/classes/render_emitter_.emitter.html @@ -0,0 +1,222 @@ + + + + + Class: Emitter | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Emitter

+ + + +
+
+

Hierarchy

    +
  • Emitter
  • +
+

Constructors

constructor

+ new Emitter(keepOutputType: boolean | undefined): Emitter

+

Defined in render/emitter.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
keepOutputTypeboolean | undefined
+

Returns: Emitter

+

Properties

break

break: boolean = false

+

Defined in render/emitter.ts:5

+
+

continue

continue: boolean = false

+

Defined in render/emitter.ts:6

+
+

html

html: any = “”

+

Defined in render/emitter.ts:4

+
+

Private Optional keepOutputType

keepOutputType? : undefined | false | true = false

+

Defined in render/emitter.ts:7

+

Methods

write

write(html: any): void

+

Defined in render/emitter.ts:13

+

Parameters:

+ + + + + + + + + + + +
NameType
htmlany
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/render_expression_.expression.html b/api/classes/render_expression_.expression.html new file mode 100644 index 000000000..65d44f3fb --- /dev/null +++ b/api/classes/render_expression_.expression.html @@ -0,0 +1,217 @@ + + + + + Class: Expression | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Expression

+ + + +
+
+

Hierarchy

    +
  • Expression
  • +
+

Constructors

constructor

+ new Expression(tokens: IterableIterator‹Token›): Expression

+

Defined in render/expression.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensIterableIterator‹Token
+

Returns: Expression

+

Properties

Private postfix

postfix: Token[]

+

Defined in render/expression.ts:18

+

Methods

evaluate

evaluate(ctx: Context, lenient: boolean): any

+

Defined in render/expression.ts:23

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
lenientboolean
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/render_render_.render.html b/api/classes/render_render_.render.html new file mode 100644 index 000000000..55e9e03e1 --- /dev/null +++ b/api/classes/render_render_.render.html @@ -0,0 +1,203 @@ + + + + + Class: Render | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_filter_filter_.filter.html b/api/classes/template_filter_filter_.filter.html new file mode 100644 index 000000000..edaea033a --- /dev/null +++ b/api/classes/template_filter_filter_.filter.html @@ -0,0 +1,238 @@ + + + + + Class: Filter | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Filter

+ + + +
+
+

Hierarchy

    +
  • Filter
  • +
+

Constructors

constructor

+ new Filter(name: string, impl: FilterImplOptions, args: FilterArg[], liquid: Liquid): Filter

+

Defined in template/filter/filter.ts:12

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
namestring
implFilterImplOptions
argsFilterArg[]
liquidLiquid
+

Returns: Filter

+

Properties

args

args: FilterArg[]

+

Defined in template/filter/filter.ts:10

+
+

Private impl

impl: FilterImplOptions

+

Defined in template/filter/filter.ts:11

+
+

Private liquid

liquid: Liquid

+

Defined in template/filter/filter.ts:12

+
+

name

name: string

+

Defined in template/filter/filter.ts:9

+

Methods

render

render(value: any, context: Context): any

+

Defined in template/filter/filter.ts:20

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valueany
contextContext
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_filter_filter_map_.filtermap.html b/api/classes/template_filter_filter_map_.filtermap.html new file mode 100644 index 000000000..f43b9da3a --- /dev/null +++ b/api/classes/template_filter_filter_map_.filtermap.html @@ -0,0 +1,268 @@ + + + + + Class: FilterMap | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: FilterMap

+ + + +
+
+

Hierarchy

    +
  • FilterMap
  • +
+

Constructors

constructor

+ new FilterMap(strictFilters: boolean, liquid: Liquid): FilterMap

+

Defined in template/filter/filter-map.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strictFiltersboolean
liquidLiquid
+

Returns: FilterMap

+

Properties

Private impls

impls: object

+

Defined in template/filter/filter-map.ts:8

+

Type declaration:

+
+

Private liquid

liquid: Liquid

+

Defined in template/filter/filter-map.ts:12

+
+

Private strictFilters

strictFilters: boolean

+

Defined in template/filter/filter-map.ts:11

+

Methods

create

create(name: string, args: FilterArg[]): Filter

+

Defined in template/filter/filter-map.ts:25

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
argsFilterArg[]
+

Returns: Filter

+
+

get

get(name: string): FilterImplOptions

+

Defined in template/filter/filter-map.ts:15

+

Parameters:

+ + + + + + + + + + + +
NameType
namestring
+

Returns: FilterImplOptions

+
+

set

set(name: string, impl: FilterImplOptions): void

+

Defined in template/filter/filter-map.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
implFilterImplOptions
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_html_.html.html b/api/classes/template_html_.html.html new file mode 100644 index 000000000..b2d2562b4 --- /dev/null +++ b/api/classes/template_html_.html.html @@ -0,0 +1,229 @@ + + + + + Class: HTML | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HTML

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new HTML(token: HTMLToken): HTML

+

Overrides TemplateImpl.constructor

+

Defined in template/html.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenHTMLToken
+

Returns: HTML

+

Properties

Private str

str: string

+

Defined in template/html.ts:8

+
+

token

token: HTMLToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹void›

+

Implementation of Template

+

Defined in template/html.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹void›

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_output_.output.html b/api/classes/template_output_.output.html new file mode 100644 index 000000000..4bc634093 --- /dev/null +++ b/api/classes/template_output_.output.html @@ -0,0 +1,233 @@ + + + + + Class: Output | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Output

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new Output(token: OutputToken, liquid: Liquid): Output

+

Overrides TemplateImpl.constructor

+

Defined in template/output.ts:10

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenOutputToken
liquidLiquid
+

Returns: Output

+

Properties

token

token: OutputToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+
+

Private value

value: Value

+

Defined in template/output.ts:10

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹IterableIterator‹any››

+

Implementation of Template

+

Defined in template/output.ts:15

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹IterableIterator‹any››

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_tag_hash_.hash.html b/api/classes/template_tag_hash_.hash.html new file mode 100644 index 000000000..19b2c707d --- /dev/null +++ b/api/classes/template_tag_hash_.hash.html @@ -0,0 +1,216 @@ + + + + + Class: Hash | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Hash

+ + + +
+
+

Hierarchy

    +
  • Hash
  • +
+

Constructors

constructor

+ new Hash(markup: string): Hash

+

Defined in template/tag/hash.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
markupstring
+

Returns: Hash

+

Properties

hash

hash: object

+

Defined in template/tag/hash.ts:14

+

Type declaration:

    +
  • [ key: string]: any
  • +
+

Methods

render

render(ctx: Context): IterableIterator‹any›

+

Defined in template/tag/hash.ts:21

+

Parameters:

+ + + + + + + + + + + +
NameType
ctxContext
+

Returns: IterableIterator‹any›

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_tag_tag_.tag.html b/api/classes/template_tag_tag_.tag.html new file mode 100644 index 000000000..71cb67d46 --- /dev/null +++ b/api/classes/template_tag_tag_.tag.html @@ -0,0 +1,240 @@ + + + + + Class: Tag | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Tag

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new Tag(token: TagToken, tokens: TopLevelToken[], liquid: Liquid): Tag

+

Overrides TemplateImpl.constructor

+

Defined in template/tag/tag.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tokenTagToken
tokensTopLevelToken[]
liquidLiquid
+

Returns: Tag

+

Properties

Private impl

impl: TagImpl

+

Defined in template/tag/tag.ts:9

+
+

name

name: string

+

Defined in template/tag/tag.ts:8

+
+

token

token: TagToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹any›

+

Implementation of Template

+

Defined in template/tag/tag.ts:23

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹any›

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_tag_tag_map_.tagmap.html b/api/classes/template_tag_tag_map_.tagmap.html new file mode 100644 index 000000000..b53949eb9 --- /dev/null +++ b/api/classes/template_tag_tag_map_.tagmap.html @@ -0,0 +1,221 @@ + + + + + Class: TagMap | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TagMap

+ + + +
+
+

Hierarchy

    +
  • TagMap
  • +
+

Properties

Private impls

impls: object

+

Defined in template/tag/tag-map.ts:5

+

Type declaration:

+

Methods

get

get(name: string): TagImplOptions

+

Defined in template/tag/tag-map.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
namestring
+

Returns: TagImplOptions

+
+

set

set(name: string, impl: TagImplOptions): void

+

Defined in template/tag/tag-map.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
implTagImplOptions
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_template_impl_.templateimpl.html b/api/classes/template_template_impl_.templateimpl.html new file mode 100644 index 000000000..59bf597dc --- /dev/null +++ b/api/classes/template_template_impl_.templateimpl.html @@ -0,0 +1,202 @@ + + + + + Class: TemplateImpl <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TemplateImpl <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

+

Constructors

constructor

+ new TemplateImpl(token: T): TemplateImpl

+

Defined in template/template-impl.ts:2

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenT
+

Returns: TemplateImpl

+

Properties

token

token: T

+

Defined in template/template-impl.ts:2

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/template_value_.value.html b/api/classes/template_value_.value.html new file mode 100644 index 000000000..ed49efbc8 --- /dev/null +++ b/api/classes/template_value_.value.html @@ -0,0 +1,227 @@ + + + + + Class: Value | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Value

+ + + +
+
+

Hierarchy

    +
  • Value
  • +
+

Constructors

constructor

+ new Value(str: string, liquid: Liquid): Value

+

Defined in template/value.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
strstringthe value to be valuated, eg.: “foobar”
liquidLiquid-
+

Returns: Value

+

Properties

filters

filters: Filter[] = []

+

Defined in template/value.ts:8

+
+

initial

initial: Expression

+

Defined in template/value.ts:9

+

Methods

value

value(ctx: Context, lenient: boolean): IterableIterator‹any›

+

Defined in template/value.ts:19

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
lenientboolean
+

Returns: IterableIterator‹any›

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_delimited_token_.delimitedtoken.html b/api/classes/tokens_delimited_token_.delimitedtoken.html new file mode 100644 index 000000000..f72f50912 --- /dev/null +++ b/api/classes/tokens_delimited_token_.delimitedtoken.html @@ -0,0 +1,270 @@ + + + + + Class: DelimitedToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: DelimitedToken

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new DelimitedToken(kind: TokenKind, content: string, input: string, begin: number, end: number, trimLeft: boolean, trimRight: boolean, file?: undefined | string): DelimitedToken

+

Overrides Token.constructor

+

Defined in tokens/delimited-token.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
kindTokenKind
contentstring
inputstring
beginnumber
endnumber
trimLeftboolean
trimRightboolean
file?undefined | string
+

Returns: DelimitedToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: boolean = false

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_filter_token_.filtertoken.html b/api/classes/tokens_filter_token_.filtertoken.html new file mode 100644 index 000000000..6362a27fb --- /dev/null +++ b/api/classes/tokens_filter_token_.filtertoken.html @@ -0,0 +1,257 @@ + + + + + Class: FilterToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: FilterToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    FilterToken

    +
  • +
+

Constructors

constructor

+ new FilterToken(name: string, args: FilterArg[], input: string, begin: number, end: number, file?: undefined | string): FilterToken

+

Overrides Token.constructor

+

Defined in tokens/filter-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
namestring
argsFilterArg[]
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: FilterToken

+

Properties

args

args: FilterArg[]

+

Defined in tokens/filter-token.ts:8

+
+

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: string

+

Defined in tokens/filter-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_hash_token_.hashtoken.html b/api/classes/tokens_hash_token_.hashtoken.html new file mode 100644 index 000000000..678ea7005 --- /dev/null +++ b/api/classes/tokens_hash_token_.hashtoken.html @@ -0,0 +1,257 @@ + + + + + Class: HashToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HashToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    HashToken

    +
  • +
+

Constructors

constructor

+ new HashToken(input: string, begin: number, end: number, name: IdentifierToken, value?: ValueToken, file?: undefined | string): HashToken

+

Overrides Token.constructor

+

Defined in tokens/hash-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
nameIdentifierToken
value?ValueToken
file?undefined | string
+

Returns: HashToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/hash-token.ts:9

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/hash-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/hash-token.ts:13

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/hash-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: IdentifierToken

+

Defined in tokens/hash-token.ts:11

+
+

Optional value

value? : ValueToken

+

Defined in tokens/hash-token.ts:12

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_html_token_.htmltoken.html b/api/classes/tokens_html_token_.htmltoken.html new file mode 100644 index 000000000..6f9ff2423 --- /dev/null +++ b/api/classes/tokens_html_token_.htmltoken.html @@ -0,0 +1,253 @@ + + + + + Class: HTMLToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HTMLToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    HTMLToken

    +
  • +
+

Constructors

constructor

+ new HTMLToken(input: string, begin: number, end: number, file?: undefined | string): HTMLToken

+

Overrides Token.constructor

+

Defined in tokens/html-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: HTMLToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/html-token.ts:9

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/html-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/html-token.ts:11

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/html-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: number = 0

+

Defined in tokens/html-token.ts:5

+
+

trimRight

trimRight: number = 0

+

Defined in tokens/html-token.ts:6

+

Methods

getContent

getContent(): string

+

Defined in tokens/html-token.ts:15

+

Returns: string

+
+

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_identifier_token_.identifiertoken.html b/api/classes/tokens_identifier_token_.identifiertoken.html new file mode 100644 index 000000000..3db608826 --- /dev/null +++ b/api/classes/tokens_identifier_token_.identifiertoken.html @@ -0,0 +1,265 @@ + + + + + Class: IdentifierToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: IdentifierToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    IdentifierToken

    +
  • +
+

Constructors

constructor

+ new IdentifierToken(input: string, begin: number, end: number, file?: undefined | string): IdentifierToken

+

Overrides Token.constructor

+

Defined in tokens/identifier-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: IdentifierToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/identifier-token.ts:9

+
+

content

content: string

+

Defined in tokens/identifier-token.ts:6

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/identifier-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/identifier-token.ts:11

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/identifier-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

isNumber

isNumber(allowSign: boolean): boolean

+

Defined in tokens/identifier-token.ts:16

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
allowSignbooleanfalse
+

Returns: boolean

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_literal_token_.literaltoken.html b/api/classes/tokens_literal_token_.literaltoken.html new file mode 100644 index 000000000..b5f987cf8 --- /dev/null +++ b/api/classes/tokens_literal_token_.literaltoken.html @@ -0,0 +1,246 @@ + + + + + Class: LiteralToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LiteralToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    LiteralToken

    +
  • +
+

Constructors

constructor

+ new LiteralToken(input: string, begin: number, end: number, file?: undefined | string): LiteralToken

+

Overrides Token.constructor

+

Defined in tokens/literal-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: LiteralToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/literal-token.ts:8

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/literal-token.ts:9

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/literal-token.ts:10

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/literal-token.ts:7

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

literal

literal: string

+

Defined in tokens/literal-token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_number_token_.numbertoken.html b/api/classes/tokens_number_token_.numbertoken.html new file mode 100644 index 000000000..b1e0b98b4 --- /dev/null +++ b/api/classes/tokens_number_token_.numbertoken.html @@ -0,0 +1,241 @@ + + + + + Class: NumberToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: NumberToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    NumberToken

    +
  • +
+

Constructors

constructor

+ new NumberToken(whole: IdentifierToken, decimal?: IdentifierToken): NumberToken

+

Overrides Token.constructor

+

Defined in tokens/number-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
wholeIdentifierToken
decimal?IdentifierToken
+

Returns: NumberToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

Optional decimal

decimal? : IdentifierToken

+

Defined in tokens/number-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

whole

whole: IdentifierToken

+

Defined in tokens/number-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_operator_token_.operatortoken.html b/api/classes/tokens_operator_token_.operatortoken.html new file mode 100644 index 000000000..47f4ac8e0 --- /dev/null +++ b/api/classes/tokens_operator_token_.operatortoken.html @@ -0,0 +1,250 @@ + + + + + Class: OperatorToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: OperatorToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    OperatorToken

    +
  • +
+

Constructors

constructor

+ new OperatorToken(input: string, begin: number, end: number, file?: undefined | string): OperatorToken

+

Overrides Token.constructor

+

Defined in tokens/operator-token.ts:17

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: OperatorToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/operator-token.ts:20

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/operator-token.ts:21

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/operator-token.ts:22

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/operator-token.ts:19

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

operator

operator: string

+

Defined in tokens/operator-token.ts:17

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getPrecedence

getPrecedence(): any

+

Defined in tokens/operator-token.ts:27

+

Returns: any

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_output_token_.outputtoken.html b/api/classes/tokens_output_token_.outputtoken.html new file mode 100644 index 000000000..472fc0a01 --- /dev/null +++ b/api/classes/tokens_output_token_.outputtoken.html @@ -0,0 +1,256 @@ + + + + + Class: OutputToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: OutputToken

+ + + +
+
+

Hierarchy

DelimitedToken

+

OutputToken

+

Constructors

constructor

+ new OutputToken(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: undefined | string): OutputToken

+

Overrides DelimitedToken.constructor

+

Defined in tokens/output-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
optionsNormalizedFullOptions
file?undefined | string
+

Returns: OutputToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Inherited from DelimitedToken.content

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: boolean = false

+

Inherited from DelimitedToken.trimLeft

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Inherited from DelimitedToken.trimRight

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_property_access_token_.propertyaccesstoken.html b/api/classes/tokens_property_access_token_.propertyaccesstoken.html new file mode 100644 index 000000000..d83e8940a --- /dev/null +++ b/api/classes/tokens_property_access_token_.propertyaccesstoken.html @@ -0,0 +1,249 @@ + + + + + Class: PropertyAccessToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: PropertyAccessToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    PropertyAccessToken

    +
  • +
+

Constructors

constructor

+ new PropertyAccessToken(variable: IdentifierToken | QuotedToken, props: IdentifierToken | QuotedToken | PropertyAccessToken[], end: number): PropertyAccessToken

+

Overrides Token.constructor

+

Defined in tokens/property-access-token.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
variableIdentifierToken | QuotedToken
propsIdentifierToken | QuotedToken | PropertyAccessToken[]
endnumber
+

Returns: PropertyAccessToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

props

props: IdentifierToken | QuotedToken | PropertyAccessToken[]

+

Defined in tokens/property-access-token.ts:10

+
+

variable

variable: IdentifierToken | QuotedToken

+

Defined in tokens/property-access-token.ts:9

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

getVariableAsText

getVariableAsText(): string

+

Defined in tokens/property-access-token.ts:16

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_quoted_token_.quotedtoken.html b/api/classes/tokens_quoted_token_.quotedtoken.html new file mode 100644 index 000000000..db7dfeab9 --- /dev/null +++ b/api/classes/tokens_quoted_token_.quotedtoken.html @@ -0,0 +1,243 @@ + + + + + Class: QuotedToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: QuotedToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    QuotedToken

    +
  • +
+

Constructors

constructor

+ new QuotedToken(input: string, begin: number, end: number, file?: undefined | string): QuotedToken

+

Overrides Token.constructor

+

Defined in tokens/quoted-token.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: QuotedToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/quoted-token.ts:7

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/quoted-token.ts:8

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/quoted-token.ts:9

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/quoted-token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_range_token_.rangetoken.html b/api/classes/tokens_range_token_.rangetoken.html new file mode 100644 index 000000000..5dae32d08 --- /dev/null +++ b/api/classes/tokens_range_token_.rangetoken.html @@ -0,0 +1,257 @@ + + + + + Class: RangeToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: RangeToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    RangeToken

    +
  • +
+

Constructors

constructor

+ new RangeToken(input: string, begin: number, end: number, lhs: ValueToken, rhs: ValueToken, file?: undefined | string): RangeToken

+

Overrides Token.constructor

+

Defined in tokens/range-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
lhsValueToken
rhsValueToken
file?undefined | string
+

Returns: RangeToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/range-token.ts:8

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/range-token.ts:9

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/range-token.ts:12

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/range-token.ts:7

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

lhs

lhs: ValueToken

+

Defined in tokens/range-token.ts:10

+
+

rhs

rhs: ValueToken

+

Defined in tokens/range-token.ts:11

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_tag_token_.tagtoken.html b/api/classes/tokens_tag_token_.tagtoken.html new file mode 100644 index 000000000..7a6192937 --- /dev/null +++ b/api/classes/tokens_tag_token_.tagtoken.html @@ -0,0 +1,262 @@ + + + + + Class: TagToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TagToken

+ + + +
+
+

Hierarchy

DelimitedToken

+

TagToken

+

Constructors

constructor

+ new TagToken(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: undefined | string): TagToken

+

Overrides DelimitedToken.constructor

+

Defined in tokens/tag-token.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
optionsNormalizedFullOptions
file?undefined | string
+

Returns: TagToken

+

Properties

args

args: string

+

Defined in tokens/tag-token.ts:9

+
+

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Inherited from DelimitedToken.content

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: string

+

Defined in tokens/tag-token.ts:8

+
+

trimLeft

trimLeft: boolean = false

+

Inherited from DelimitedToken.trimLeft

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Inherited from DelimitedToken.trimRight

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/tokens_token_.token.html b/api/classes/tokens_token_.token.html new file mode 100644 index 000000000..64c2c807b --- /dev/null +++ b/api/classes/tokens_token_.token.html @@ -0,0 +1,248 @@ + + + + + Class: Token | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Token

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new Token(kind: TokenKind, input: string, begin: number, end: number, file?: undefined | string): Token

+

Defined in tokens/token.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
kindTokenKind
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: Token

+

Properties

begin

begin: number

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.assertionerror.html b/api/classes/util_error_.assertionerror.html new file mode 100644 index 000000000..ba3633e84 --- /dev/null +++ b/api/classes/util_error_.assertionerror.html @@ -0,0 +1,212 @@ + + + + + Class: AssertionError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: AssertionError

+ + + +
+
+

Hierarchy

    +
  • Error

    +

    AssertionError

    +
  • +
+

Constructors

constructor

+ new AssertionError(message: string): AssertionError

+

Defined in util/error.ts:74

+

Parameters:

+ + + + + + + + + + + +
NameType
messagestring
+

Returns: AssertionError

+

Properties

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.internalundefinedvariableerror.html b/api/classes/util_error_.internalundefinedvariableerror.html new file mode 100644 index 000000000..396b5e934 --- /dev/null +++ b/api/classes/util_error_.internalundefinedvariableerror.html @@ -0,0 +1,215 @@ + + + + + Class: InternalUndefinedVariableError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: InternalUndefinedVariableError

+ + + +
+
+

Hierarchy

    +
  • Error

    +

    InternalUndefinedVariableError

    +
  • +
+

Constructors

constructor

+ new InternalUndefinedVariableError(variableName: string): InternalUndefinedVariableError

+

Defined in util/error.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
variableNamestring
+

Returns: InternalUndefinedVariableError

+

Properties

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

variableName

variableName: string

+

Defined in util/error.ts:65

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.liquiderror.html b/api/classes/util_error_.liquiderror.html new file mode 100644 index 000000000..c1136b4c3 --- /dev/null +++ b/api/classes/util_error_.liquiderror.html @@ -0,0 +1,232 @@ + + + + + Class: LiquidError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LiquidError

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new LiquidError(err: Error, token: Token): LiquidError

+

Defined in util/error.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: LiquidError

+

Properties

context

context: string

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Private originalError

originalError: Error

+

Defined in util/error.ts:8

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

Private token

token: Token

+

Defined in util/error.ts:6

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+

Methods

Protected update

update(): void

+

Defined in util/error.ts:15

+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.parseerror.html b/api/classes/util_error_.parseerror.html new file mode 100644 index 000000000..0cfaad421 --- /dev/null +++ b/api/classes/util_error_.parseerror.html @@ -0,0 +1,219 @@ + + + + + Class: ParseError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ParseError

+ + + +
+
+

Hierarchy

LiquidError

+

ParseError

+

Constructors

constructor

+ new ParseError(err: Error, token: Token): ParseError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:32

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: ParseError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.rendererror.html b/api/classes/util_error_.rendererror.html new file mode 100644 index 000000000..0fe1391e6 --- /dev/null +++ b/api/classes/util_error_.rendererror.html @@ -0,0 +1,236 @@ + + + + + Class: RenderError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: RenderError

+ + + +
+
+

Hierarchy

LiquidError

+

RenderError

+

Constructors

constructor

+ new RenderError(err: Error, tpl: Template): RenderError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tplTemplate
+

Returns: RenderError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+
+

Static is

is(obj: any): boolean

+

Defined in util/error.ts:48

+

Parameters:

+ + + + + + + + + + + +
NameType
objany
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.tokenizationerror.html b/api/classes/util_error_.tokenizationerror.html new file mode 100644 index 000000000..785d89fb2 --- /dev/null +++ b/api/classes/util_error_.tokenizationerror.html @@ -0,0 +1,219 @@ + + + + + Class: TokenizationError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TokenizationError

+ + + +
+
+

Hierarchy

LiquidError

+

TokenizationError

+

Constructors

constructor

+ new TokenizationError(message: string, token: Token): TokenizationError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:24

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
messagestring
tokenToken
+

Returns: TokenizationError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_error_.undefinedvariableerror.html b/api/classes/util_error_.undefinedvariableerror.html new file mode 100644 index 000000000..8f7b54db9 --- /dev/null +++ b/api/classes/util_error_.undefinedvariableerror.html @@ -0,0 +1,219 @@ + + + + + Class: UndefinedVariableError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: UndefinedVariableError

+ + + +
+
+

Hierarchy

LiquidError

+

UndefinedVariableError

+

Constructors

constructor

+ new UndefinedVariableError(err: Error, token: Token): UndefinedVariableError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:53

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: UndefinedVariableError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/classes/util_strftime_.timezonedate.html b/api/classes/util_strftime_.timezonedate.html new file mode 100644 index 000000000..531603f51 --- /dev/null +++ b/api/classes/util_strftime_.timezonedate.html @@ -0,0 +1,829 @@ + + + + + Class: TimezoneDate | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TimezoneDate

+ + + +
+
+

Hierarchy

    +
  • Date

    +

    TimezoneDate

    +
  • +
+

Constructors

constructor

+ new TimezoneDate(dateString: string): TimezoneDate

+

Defined in util/strftime.ts:180

+

Parameters:

+ + + + + + + + + + + +
NameType
dateStringstring
+

Returns: TimezoneDate

+

Properties

ISO8601_TIMEZONE_PATTERN

ISO8601_TIMEZONE_PATTERN: RegExp = /([zZ]|([+-])(\d{2}):(\d{2}))$/

+

Defined in util/strftime.ts:178

+
+

dateString

dateString: string

+

Defined in util/strftime.ts:182

+
+

inputTimezoneOffset

inputTimezoneOffset: number = 0

+

Defined in util/strftime.ts:180

+
+

Static Date

Date: DateConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:907

+

Methods

__@toPrimitive

__@toPrimitive(hint: “default”): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:109

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“default”
+

Returns: string

+

__@toPrimitive(hint: “string”): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:113

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“string”
+

Returns: string

+

__@toPrimitive(hint: “number”): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“number”
+

Returns: number

+

__@toPrimitive(hint: string): string | number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:126

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
hintstringThe strings “number”, “string”, or “default” to specify what primitive to return.
+

Returns: string | number

+

A number if ‘hint’ was “number”, a string if ‘hint’ was “string” or “default”.

+
+

getDate

getDate(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:755

+

Returns: number

+
+

getDay

getDay(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:759

+

Returns: number

+
+

getDisplayDate

getDisplayDate(): Date

+

Defined in util/strftime.ts:194

+

Returns: Date

+
+

getFullYear

getFullYear(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:747

+

Returns: number

+
+

getHours

getHours(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:763

+

Returns: number

+
+

getMilliseconds

getMilliseconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:775

+

Returns: number

+
+

getMinutes

getMinutes(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:767

+

Returns: number

+
+

getMonth

getMonth(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:751

+

Returns: number

+
+

getSeconds

getSeconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:771

+

Returns: number

+
+

getTime

getTime(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:745

+

Returns: number

+
+

getTimezoneOffset

getTimezoneOffset(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:779

+

Returns: number

+
+

getUTCDate

getUTCDate(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:757

+

Returns: number

+
+

getUTCDay

getUTCDay(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:761

+

Returns: number

+
+

getUTCFullYear

getUTCFullYear(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:749

+

Returns: number

+
+

getUTCHours

getUTCHours(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:765

+

Returns: number

+
+

getUTCMilliseconds

getUTCMilliseconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:777

+

Returns: number

+
+

getUTCMinutes

getUTCMinutes(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:769

+

Returns: number

+
+

getUTCMonth

getUTCMonth(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:753

+

Returns: number

+
+

getUTCSeconds

getUTCSeconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:773

+

Returns: number

+
+

setDate

setDate(date: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:842

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
datenumberA numeric value equal to the day of the month.
+

Returns: number

+
+

setFullYear

setFullYear(year: number, month?: undefined | number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:866

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
yearnumberA numeric value for the year.
month?undefined | numberA zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
date?undefined | numberA numeric value equal for the day of the month.
+

Returns: number

+
+

setHours

setHours(hours: number, min?: undefined | number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:829

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
hoursnumberA numeric value equal to the hours value.
min?undefined | numberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setMilliseconds

setMilliseconds(ms: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:789

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
msnumberA numeric value equal to the millisecond value.
+

Returns: number

+
+

setMinutes

setMinutes(min: number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:814

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minnumberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setMonth

setMonth(month: number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:853

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
monthnumberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
date?undefined | numberA numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
+

Returns: number

+
+

setSeconds

setSeconds(sec: number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:801

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
secnumberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setTime

setTime(time: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:784

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
timenumberA numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.
+

Returns: number

+
+

setUTCDate

setUTCDate(date: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:847

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
datenumberA numeric value equal to the day of the month.
+

Returns: number

+
+

setUTCFullYear

setUTCFullYear(year: number, month?: undefined | number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:873

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
yearnumberA numeric value equal to the year.
month?undefined | numberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
date?undefined | numberA numeric value equal to the day of the month.
+

Returns: number

+
+

setUTCHours

setUTCHours(hours: number, min?: undefined | number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:837

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
hoursnumberA numeric value equal to the hours value.
min?undefined | numberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setUTCMilliseconds

setUTCMilliseconds(ms: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:794

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
msnumberA numeric value equal to the millisecond value.
+

Returns: number

+
+

setUTCMinutes

setUTCMinutes(min: number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:821

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minnumberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setUTCMonth

setUTCMonth(month: number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:859

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
monthnumberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
date?undefined | numberA numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
+

Returns: number

+
+

setUTCSeconds

setUTCSeconds(sec: number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:807

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
secnumberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

toDateString

toDateString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:733

+

Returns: string

+
+

toISOString

toISOString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:877

+

Returns: string

+
+

toJSON

toJSON(key?: any): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:879

+

Parameters:

+ + + + + + + + + + + +
NameType
key?any
+

Returns: string

+
+

toLocaleDateString

toLocaleDateString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:739

+

Returns: string

+
+

toLocaleString

toLocaleString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:737

+

Returns: string

+
+

toLocaleTimeString

toLocaleTimeString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:741

+

Returns: string

+
+

toString

toString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:731

+

Returns: string

+
+

toTimeString

toTimeString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:735

+

Returns: string

+
+

toUTCString

toUTCString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:875

+

Returns: string

+
+

valueOf

valueOf(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:743

+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/enums/context_block_mode_.blockmode.html b/api/enums/context_block_mode_.blockmode.html new file mode 100644 index 000000000..05914706d --- /dev/null +++ b/api/enums/context_block_mode_.blockmode.html @@ -0,0 +1,181 @@ + + + + + Enumeration: BlockMode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/enums/parser_token_kind_.tokenkind.html b/api/enums/parser_token_kind_.tokenkind.html new file mode 100644 index 000000000..9da73173b --- /dev/null +++ b/api/enums/parser_token_kind_.tokenkind.html @@ -0,0 +1,214 @@ + + + + + Enumeration: TokenKind | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Enumeration: TokenKind

+ + + +
+
+

Enumeration members

Delimited

Delimited: = Tag | Output

+

Defined in parser/token-kind.ts:14

+
+

Filter

Filter: = 32

+

Defined in parser/token-kind.ts:7

+
+

HTML

HTML: = 16

+

Defined in parser/token-kind.ts:6

+
+

Hash

Hash: = 64

+

Defined in parser/token-kind.ts:8

+
+

Literal

Literal: = 2

+

Defined in parser/token-kind.ts:3

+
+

Number

Number: = 1

+

Defined in parser/token-kind.ts:2

+
+

Operator

Operator: = 2048

+

Defined in parser/token-kind.ts:13

+
+

Output

Output: = 8

+

Defined in parser/token-kind.ts:5

+
+

PropertyAccess

PropertyAccess: = 128

+

Defined in parser/token-kind.ts:9

+
+

Quoted

Quoted: = 1024

+

Defined in parser/token-kind.ts:12

+
+

Range

Range: = 512

+

Defined in parser/token-kind.ts:11

+
+

Tag

Tag: = 4

+

Defined in parser/token-kind.ts:4

+
+

Word

Word: = 256

+

Defined in parser/token-kind.ts:10

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/globals.html b/api/globals.html new file mode 100644 index 000000000..26986cb28 --- /dev/null +++ b/api/globals.html @@ -0,0 +1,176 @@ + + + + + liquidjs | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/cache_cache_.cache.html b/api/interfaces/cache_cache_.cache.html new file mode 100644 index 000000000..e524e8dce --- /dev/null +++ b/api/interfaces/cache_cache_.cache.html @@ -0,0 +1,220 @@ + + + + + Interface: Cache <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Cache <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • Cache
  • +
+

Implemented by

+

Methods

read

read(key: string): T | undefined | Promise‹T | undefined›

+

Defined in cache/cache.ts:3

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: T | undefined | Promise‹T | undefined›

+
+

write

write(key: string, value: T): void | Promise‹void›

+

Defined in cache/cache.ts:2

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueT
+

Returns: void | Promise‹void›

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/context_scope_.plainobject.html b/api/interfaces/context_scope_.plainobject.html new file mode 100644 index 000000000..4b796c711 --- /dev/null +++ b/api/interfaces/context_scope_.plainobject.html @@ -0,0 +1,184 @@ + + + + + Interface: PlainObject | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/drop_comparable_.comparable.html b/api/interfaces/drop_comparable_.comparable.html new file mode 100644 index 000000000..aa798729d --- /dev/null +++ b/api/interfaces/drop_comparable_.comparable.html @@ -0,0 +1,268 @@ + + + + + Interface: Comparable | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Comparable

+ + + +
+
+

Hierarchy

    +
  • Comparable
  • +
+

Implemented by

+

Properties

equals

equals: function

+

Defined in drop/comparable.ts:4

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

geq

geq: function

+

Defined in drop/comparable.ts:6

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

gt

gt: function

+

Defined in drop/comparable.ts:5

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

leq

leq: function

+

Defined in drop/comparable.ts:8

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

lt

lt: function

+

Defined in drop/comparable.ts:7

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/fs_fs_.fs.html b/api/interfaces/fs_fs_.fs.html new file mode 100644 index 000000000..2e7e9e3e7 --- /dev/null +++ b/api/interfaces/fs_fs_.fs.html @@ -0,0 +1,274 @@ + + + + + Interface: FS | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: FS

+ + + +
+
+

Hierarchy

    +
  • FS
  • +
+

Properties

exists

exists: function

+

Defined in fs/fs.ts:2

+

Type declaration:

▸ (filepath: string): Promise‹boolean›

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

existsSync

existsSync: function

+

Defined in fs/fs.ts:4

+

Type declaration:

▸ (filepath: string): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

Optional fallback

fallback? : undefined | function

+

Defined in fs/fs.ts:7

+
+

readFile

readFile: function

+

Defined in fs/fs.ts:3

+

Type declaration:

▸ (filepath: string): Promise‹string›

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

readFileSync

readFileSync: function

+

Defined in fs/fs.ts:5

+

Type declaration:

▸ (filepath: string): string

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

resolve

resolve: function

+

Defined in fs/fs.ts:6

+

Type declaration:

▸ (root: string, file: string, ext: string): string

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filestring
extstring
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/liquid_options_.liquidoptions.html b/api/interfaces/liquid_options_.liquidoptions.html new file mode 100644 index 000000000..b7422a25a --- /dev/null +++ b/api/interfaces/liquid_options_.liquidoptions.html @@ -0,0 +1,246 @@ + + + + + Interface: LiquidOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: LiquidOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional cache

cache? : boolean | number | CacheTemplate[]›

+

Defined in liquid-options.ts:16

+
+

Optional dynamicPartials

dynamicPartials? : undefined | false | true

+

Defined in liquid-options.ts:20

+
+

Optional extname

extname? : undefined | string

+

Defined in liquid-options.ts:14

+
+

Optional fs

fs? : FS

+

Defined in liquid-options.ts:48

+
+

Optional globals

globals? : undefined | object

+

Defined in liquid-options.ts:50

+
+

Optional greedy

greedy? : undefined | false | true

+

Defined in liquid-options.ts:46

+
+

Optional jsTruthy

jsTruthy? : undefined | false | true

+

Defined in liquid-options.ts:18

+
+

Optional keepOutputType

keepOutputType? : undefined | false | true

+

Defined in liquid-options.ts:52

+
+

Optional lenientIf

lenientIf? : undefined | false | true

+

Defined in liquid-options.ts:26

+
+

Optional operators

operators? : Operators

+

Defined in liquid-options.ts:54

+
+

Optional outputDelimiterLeft

outputDelimiterLeft? : undefined | string

+

Defined in liquid-options.ts:40

+
+

Optional outputDelimiterRight

outputDelimiterRight? : undefined | string

+

Defined in liquid-options.ts:42

+
+

Optional preserveTimezones

preserveTimezones? : undefined | false | true

+

Defined in liquid-options.ts:44

+
+

Optional root

root? : string | string[]

+

Defined in liquid-options.ts:12

+
+

Optional strictFilters

strictFilters? : undefined | false | true

+

Defined in liquid-options.ts:22

+
+

Optional strictVariables

strictVariables? : undefined | false | true

+

Defined in liquid-options.ts:24

+
+

Optional tagDelimiterLeft

tagDelimiterLeft? : undefined | string

+

Defined in liquid-options.ts:36

+
+

Optional tagDelimiterRight

tagDelimiterRight? : undefined | string

+

Defined in liquid-options.ts:38

+
+

Optional trimOutputLeft

trimOutputLeft? : undefined | false | true

+

Defined in liquid-options.ts:34

+
+

Optional trimOutputRight

trimOutputRight? : undefined | false | true

+

Defined in liquid-options.ts:32

+
+

Optional trimTagLeft

trimTagLeft? : undefined | false | true

+

Defined in liquid-options.ts:30

+
+

Optional trimTagRight

trimTagRight? : undefined | false | true

+

Defined in liquid-options.ts:28

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/liquid_options_.normalizedfulloptions.html b/api/interfaces/liquid_options_.normalizedfulloptions.html new file mode 100644 index 000000000..484446ba3 --- /dev/null +++ b/api/interfaces/liquid_options_.normalizedfulloptions.html @@ -0,0 +1,269 @@ + + + + + Interface: NormalizedFullOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: NormalizedFullOptions

+ + + +
+
+

Hierarchy

NormalizedOptions

+

NormalizedFullOptions

+

Properties

cache

cache: undefined | CacheTemplate[]›

+

Overrides NormalizedOptions.cache

+

Defined in liquid-options.ts:66

+
+

dynamicPartials

dynamicPartials: boolean

+

Overrides LiquidOptions.dynamicPartials

+

Defined in liquid-options.ts:68

+
+

extname

extname: string

+

Overrides LiquidOptions.extname

+

Defined in liquid-options.ts:65

+
+

fs

fs: FS

+

Overrides LiquidOptions.fs

+

Defined in liquid-options.ts:69

+
+

globals

globals: object

+

Overrides LiquidOptions.globals

+

Defined in liquid-options.ts:83

+
+

greedy

greedy: boolean

+

Overrides LiquidOptions.greedy

+

Defined in liquid-options.ts:82

+
+

jsTruthy

jsTruthy: boolean

+

Overrides LiquidOptions.jsTruthy

+

Defined in liquid-options.ts:67

+
+

keepOutputType

keepOutputType: boolean

+

Overrides LiquidOptions.keepOutputType

+

Defined in liquid-options.ts:84

+
+

lenientIf

lenientIf: boolean

+

Overrides LiquidOptions.lenientIf

+

Defined in liquid-options.ts:72

+
+

operators

operators: Operators

+

Overrides LiquidOptions.operators

+

Defined in liquid-options.ts:85

+
+

operatorsTrie

operatorsTrie: Trie

+

Overrides NormalizedOptions.operatorsTrie

+

Defined in liquid-options.ts:86

+
+

outputDelimiterLeft

outputDelimiterLeft: string

+

Overrides LiquidOptions.outputDelimiterLeft

+

Defined in liquid-options.ts:79

+
+

outputDelimiterRight

outputDelimiterRight: string

+

Overrides LiquidOptions.outputDelimiterRight

+

Defined in liquid-options.ts:80

+
+

preserveTimezones

preserveTimezones: boolean

+

Overrides LiquidOptions.preserveTimezones

+

Defined in liquid-options.ts:81

+
+

root

root: string[]

+

Overrides NormalizedOptions.root

+

Defined in liquid-options.ts:64

+
+

strictFilters

strictFilters: boolean

+

Overrides LiquidOptions.strictFilters

+

Defined in liquid-options.ts:70

+
+

strictVariables

strictVariables: boolean

+

Overrides LiquidOptions.strictVariables

+

Defined in liquid-options.ts:71

+
+

tagDelimiterLeft

tagDelimiterLeft: string

+

Overrides LiquidOptions.tagDelimiterLeft

+

Defined in liquid-options.ts:77

+
+

tagDelimiterRight

tagDelimiterRight: string

+

Overrides LiquidOptions.tagDelimiterRight

+

Defined in liquid-options.ts:78

+
+

trimOutputLeft

trimOutputLeft: boolean

+

Overrides LiquidOptions.trimOutputLeft

+

Defined in liquid-options.ts:76

+
+

trimOutputRight

trimOutputRight: boolean

+

Overrides LiquidOptions.trimOutputRight

+

Defined in liquid-options.ts:75

+
+

trimTagLeft

trimTagLeft: boolean

+

Overrides LiquidOptions.trimTagLeft

+

Defined in liquid-options.ts:74

+
+

trimTagRight

trimTagRight: boolean

+

Overrides LiquidOptions.trimTagRight

+

Defined in liquid-options.ts:73

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/liquid_options_.normalizedoptions.html b/api/interfaces/liquid_options_.normalizedoptions.html new file mode 100644 index 000000000..26797e0c5 --- /dev/null +++ b/api/interfaces/liquid_options_.normalizedoptions.html @@ -0,0 +1,272 @@ + + + + + Interface: NormalizedOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: NormalizedOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional cache

cache? : CacheTemplate[]›

+

Overrides LiquidOptions.cache

+

Defined in liquid-options.ts:59

+
+

Optional dynamicPartials

dynamicPartials? : undefined | false | true

+

Inherited from LiquidOptions.dynamicPartials

+

Defined in liquid-options.ts:20

+
+

Optional extname

extname? : undefined | string

+

Inherited from LiquidOptions.extname

+

Defined in liquid-options.ts:14

+
+

Optional fs

fs? : FS

+

Inherited from LiquidOptions.fs

+

Defined in liquid-options.ts:48

+
+

Optional globals

globals? : undefined | object

+

Inherited from LiquidOptions.globals

+

Defined in liquid-options.ts:50

+
+

Optional greedy

greedy? : undefined | false | true

+

Inherited from LiquidOptions.greedy

+

Defined in liquid-options.ts:46

+
+

Optional jsTruthy

jsTruthy? : undefined | false | true

+

Inherited from LiquidOptions.jsTruthy

+

Defined in liquid-options.ts:18

+
+

Optional keepOutputType

keepOutputType? : undefined | false | true

+

Inherited from LiquidOptions.keepOutputType

+

Defined in liquid-options.ts:52

+
+

Optional lenientIf

lenientIf? : undefined | false | true

+

Inherited from LiquidOptions.lenientIf

+

Defined in liquid-options.ts:26

+
+

Optional operators

operators? : Operators

+

Inherited from LiquidOptions.operators

+

Defined in liquid-options.ts:54

+
+

Optional operatorsTrie

operatorsTrie? : Trie

+

Defined in liquid-options.ts:60

+
+

Optional outputDelimiterLeft

outputDelimiterLeft? : undefined | string

+

Inherited from LiquidOptions.outputDelimiterLeft

+

Defined in liquid-options.ts:40

+
+

Optional outputDelimiterRight

outputDelimiterRight? : undefined | string

+

Inherited from LiquidOptions.outputDelimiterRight

+

Defined in liquid-options.ts:42

+
+

Optional preserveTimezones

preserveTimezones? : undefined | false | true

+

Inherited from LiquidOptions.preserveTimezones

+

Defined in liquid-options.ts:44

+
+

Optional root

root? : string[]

+

Overrides LiquidOptions.root

+

Defined in liquid-options.ts:58

+
+

Optional strictFilters

strictFilters? : undefined | false | true

+

Inherited from LiquidOptions.strictFilters

+

Defined in liquid-options.ts:22

+
+

Optional strictVariables

strictVariables? : undefined | false | true

+

Inherited from LiquidOptions.strictVariables

+

Defined in liquid-options.ts:24

+
+

Optional tagDelimiterLeft

tagDelimiterLeft? : undefined | string

+

Inherited from LiquidOptions.tagDelimiterLeft

+

Defined in liquid-options.ts:36

+
+

Optional tagDelimiterRight

tagDelimiterRight? : undefined | string

+

Inherited from LiquidOptions.tagDelimiterRight

+

Defined in liquid-options.ts:38

+
+

Optional trimOutputLeft

trimOutputLeft? : undefined | false | true

+

Inherited from LiquidOptions.trimOutputLeft

+

Defined in liquid-options.ts:34

+
+

Optional trimOutputRight

trimOutputRight? : undefined | false | true

+

Inherited from LiquidOptions.trimOutputRight

+

Defined in liquid-options.ts:32

+
+

Optional trimTagLeft

trimTagLeft? : undefined | false | true

+

Inherited from LiquidOptions.trimTagLeft

+

Defined in liquid-options.ts:30

+
+

Optional trimTagRight

trimTagRight? : undefined | false | true

+

Inherited from LiquidOptions.trimTagRight

+

Defined in liquid-options.ts:28

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/render_operator_.operators.html b/api/interfaces/render_operator_.operators.html new file mode 100644 index 000000000..6f0a601d6 --- /dev/null +++ b/api/interfaces/render_operator_.operators.html @@ -0,0 +1,204 @@ + + + + + Interface: Operators | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Operators

+ + + +
+
+

Hierarchy

    +
  • Operators
  • +
+

Indexable

    +
  • [ key: string]: function
  • +
+

▸ (lhs: any, rhs: any, ctx: Context): boolean

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lhsany
rhsany
ctxContext
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/template_filter_filter_impl_.filterimpl.html b/api/interfaces/template_filter_filter_impl_.filterimpl.html new file mode 100644 index 000000000..4da77dca2 --- /dev/null +++ b/api/interfaces/template_filter_filter_impl_.filterimpl.html @@ -0,0 +1,184 @@ + + + + + Interface: FilterImpl | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html b/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html new file mode 100644 index 000000000..cc9582b97 --- /dev/null +++ b/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html @@ -0,0 +1,203 @@ + + + + + Interface: FilterImplOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/template_tag_tag_impl_.tagimpl.html b/api/interfaces/template_tag_tag_impl_.tagimpl.html new file mode 100644 index 000000000..39b4fe974 --- /dev/null +++ b/api/interfaces/template_tag_tag_impl_.tagimpl.html @@ -0,0 +1,220 @@ + + + + + Interface: TagImpl | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: TagImpl

+ + + +
+
+

Hierarchy

+

Indexable

    +
  • [ key: string]: any
  • +
+

Properties

liquid

liquid: Liquid

+

Defined in template/tag/tag-impl.ts:5

+
+

Optional parse

parse? : undefined | function

+

Inherited from TagImplOptions.parse

+

Defined in template/tag/tag-impl-options.ts:9

+
+

render

render: function

+

Inherited from TagImplOptions.render

+

Defined in template/tag/tag-impl-options.ts:10

+

Type declaration:

▸ (this: TagImpl, ctx: Context, emitter: Emitter, hash: Hash): any

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisTagImpl
ctxContext
emitterEmitter
hashHash
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html b/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html new file mode 100644 index 000000000..86eda237e --- /dev/null +++ b/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html @@ -0,0 +1,212 @@ + + + + + Interface: TagImplOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: TagImplOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional parse

parse? : undefined | function

+

Defined in template/tag/tag-impl-options.ts:9

+
+

render

render: function

+

Defined in template/tag/tag-impl-options.ts:10

+

Type declaration:

▸ (this: TagImpl, ctx: Context, emitter: Emitter, hash: Hash): any

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisTagImpl
ctxContext
emitterEmitter
hashHash
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/template_template_.template.html b/api/interfaces/template_template_.template.html new file mode 100644 index 000000000..968bfceea --- /dev/null +++ b/api/interfaces/template_template_.template.html @@ -0,0 +1,206 @@ + + + + + Interface: Template | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/util_async_.thenable.html b/api/interfaces/util_async_.thenable.html new file mode 100644 index 000000000..7d7b87247 --- /dev/null +++ b/api/interfaces/util_async_.thenable.html @@ -0,0 +1,216 @@ + + + + + Interface: Thenable | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Thenable

+ + + +
+
+

Hierarchy

    +
  • Thenable
  • +
+

Methods

catch

catch(reject: resolver): Thenable

+

Defined in util/async.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
rejectresolver
+

Returns: Thenable

+
+

then

then(resolve: resolver, reject?: resolver): Thenable

+

Defined in util/async.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
resolveresolver
reject?resolver
+

Returns: Thenable

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/util_operator_trie_.trie.html b/api/interfaces/util_operator_trie_.trie.html new file mode 100644 index 000000000..cdd908332 --- /dev/null +++ b/api/interfaces/util_operator_trie_.trie.html @@ -0,0 +1,182 @@ + + + + + Interface: Trie | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/interfaces/util_strftime_.formatoptions.html b/api/interfaces/util_strftime_.formatoptions.html new file mode 100644 index 000000000..1b0e890d4 --- /dev/null +++ b/api/interfaces/util_strftime_.formatoptions.html @@ -0,0 +1,187 @@ + + + + + Interface: FormatOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_array_.html b/api/modules/builtin_filters_array_.html new file mode 100644 index 000000000..8c6915d42 --- /dev/null +++ b/api/modules/builtin_filters_array_.html @@ -0,0 +1,447 @@ + + + + + External module: "builtin/filters/array" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/array"

+ + + +
+
+

Functions

compact

compact<T>(this: FilterImpl, arr: T[]): any[]

+

Defined in builtin/filters/array.ts:27

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
+

Returns: any[]

+
+

concat

concat<T1, T2>(v: T1[], arg: T2[] | T2): T1 | T2[]

+

Defined in builtin/filters/array.ts:31

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vT1[]
argT2[] | T2
+

Returns: T1 | T2[]

+
+

Const first

first(v: any): any

+

Defined in builtin/filters/array.ts:9

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: any

+
+

Const join

join(v: any[], arg: string): string

+

Defined in builtin/filters/array.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vany[]
argstring
+

Returns: string

+
+

Const last

last(v: any): any

+

Defined in builtin/filters/array.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: any

+
+

map

map<T1, T2>(this: FilterImpl, arr: Scope[], property: string): object[]

+

Defined in builtin/filters/array.ts:23

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrScope[]
propertystring
+

Returns: object[]

+
+

Const reverse

reverse(v: any[]): any[]

+

Defined in builtin/filters/array.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
vany[]
+

Returns: any[]

+
+

Const size

size(v: string | any[]): number

+

Defined in builtin/filters/array.ts:21

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring | any[]
+

Returns: number

+
+

slice

slice<T>(v: T[], begin: number, length: number): T[]

+

Defined in builtin/filters/array.ts:35

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vT[]-
beginnumber-
lengthnumber1
+

Returns: T[]

+
+

sort

sort<T>(this: FilterImpl, arr: T[], property?: undefined | string): any[]

+

Defined in builtin/filters/array.ts:12

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
property?undefined | string
+

Returns: any[]

+
+

uniq

uniq<T>(arr: T[]): T[]

+

Defined in builtin/filters/array.ts:47

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
arrT[]
+

Returns: T[]

+
+

where

where<T>(this: FilterImpl, arr: T[], property: string, expected?: any): T[]

+

Defined in builtin/filters/array.ts:40

+

Type parameters:

+

T: object

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
propertystring
expected?any
+

Returns: T[]

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_date_.html b/api/modules/builtin_filters_date_.html new file mode 100644 index 000000000..3e25523c2 --- /dev/null +++ b/api/modules/builtin_filters_date_.html @@ -0,0 +1,217 @@ + + + + + External module: "builtin/filters/date" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/date"

+ + + +
+
+

Functions

date

date(this: FilterImpl, v: string | Date, arg: string): string | Date

+

Defined in builtin/filters/date.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
vstring | Date
argstring
+

Returns: string | Date

+
+

isValidDate

isValidDate(date: any): boolean

+

Defined in builtin/filters/date.ts:23

+

Parameters:

+ + + + + + + + + + + +
NameType
dateany
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_html_.html b/api/modules/builtin_filters_html_.html new file mode 100644 index 000000000..95a1b884b --- /dev/null +++ b/api/modules/builtin_filters_html_.html @@ -0,0 +1,283 @@ + + + + + External module: "builtin/filters/html" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/html"

+ + + +
+
+

Functions

escape

escape(str: string): string

+

Defined in builtin/filters/html.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

escapeOnce

escapeOnce(str: string): string

+

Defined in builtin/filters/html.ts:26

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

newlineToBr

newlineToBr(v: string): string

+

Defined in builtin/filters/html.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

stripHtml

stripHtml(v: string): string

+

Defined in builtin/filters/html.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

unescape

unescape(str: string): string

+

Defined in builtin/filters/html.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+

Object literals

Const escapeMap

escapeMap: object

Defined in builtin/filters/html.ts:3

+

: string = “"”

+

Defined in builtin/filters/html.ts:7

+

&

&: string = “&”

+

Defined in builtin/filters/html.ts:4

+

: string = “'”

+

Defined in builtin/filters/html.ts:8

+

<

<: string = “<”

+

Defined in builtin/filters/html.ts:5

+

>

>: string = “>”

+

Defined in builtin/filters/html.ts:6

+
+

Const unescapeMap

unescapeMap: object

Defined in builtin/filters/html.ts:10

+

"

": string = “””

+

Defined in builtin/filters/html.ts:14

+

'

': string = “‘“

+

Defined in builtin/filters/html.ts:15

+

&

&: string = “&”

+

Defined in builtin/filters/html.ts:11

+

>

>: string = “>”

+

Defined in builtin/filters/html.ts:13

+

<

<: string = “<”

+

Defined in builtin/filters/html.ts:12

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_index_.html b/api/modules/builtin_filters_index_.html new file mode 100644 index 000000000..ad35fb6a2 --- /dev/null +++ b/api/modules/builtin_filters_index_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/filters/index" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_math_.html b/api/modules/builtin_filters_math_.html new file mode 100644 index 000000000..d78a8fcac --- /dev/null +++ b/api/modules/builtin_filters_math_.html @@ -0,0 +1,339 @@ + + + + + External module: "builtin/filters/math" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/math"

+ + + +
+
+

Variables

Const abs

abs: abs = Math.abs

+

Defined in builtin/filters/math.ts:3

+
+

Const atLeast

atLeast: max = Math.max

+

Defined in builtin/filters/math.ts:4

+
+

Const atMost

atMost: min = Math.min

+

Defined in builtin/filters/math.ts:5

+
+

Const ceil

ceil: ceil = Math.ceil

+

Defined in builtin/filters/math.ts:6

+
+

Const floor

floor: floor = Math.floor

+

Defined in builtin/filters/math.ts:8

+

Functions

Const dividedBy

dividedBy(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

Const minus

minus(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

Const modulo

modulo(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:10

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

plus

plus(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:18

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

round

round(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
vnumber-
argnumber0
+

Returns: number

+
+

sortNatural

sortNatural(input: any[], property?: undefined | string): any[]

+

Defined in builtin/filters/math.ts:22

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
inputany[]
property?undefined | string
+

Returns: any[]

+
+

Const times

times(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:11

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_object_.html b/api/modules/builtin_filters_object_.html new file mode 100644 index 000000000..1e3129f3c --- /dev/null +++ b/api/modules/builtin_filters_object_.html @@ -0,0 +1,220 @@ + + + + + External module: "builtin/filters/object" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/object"

+ + + +
+
+

Functions

Default

Default<T1, T2>(this: FilterImpl, v: string | T1, arg: T2): string | T1 | T2

+

Defined in builtin/filters/object.ts:5

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
vstring | T1
argT2
+

Returns: string | T1 | T2

+
+

json

json(v: any): string

+

Defined in builtin/filters/object.ts:9

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_string_.html b/api/modules/builtin_filters_string_.html new file mode 100644 index 000000000..cde096985 --- /dev/null +++ b/api/modules/builtin_filters_string_.html @@ -0,0 +1,507 @@ + + + + + External module: "builtin/filters/string" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/string"

+ + + +
+
+

Functions

append

append(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

capitalize

capitalize(str: string): string

+

Defined in builtin/filters/string.ts:55

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

downcase

downcase(v: string): string

+

Defined in builtin/filters/string.ts:23

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

lstrip

lstrip(v: string): string

+

Defined in builtin/filters/string.ts:19

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

prepend

prepend(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:14

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

remove

remove(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

removeFirst

removeFirst(v: string, l: string): string

+

Defined in builtin/filters/string.ts:35

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
lstring
+

Returns: string

+
+

replace

replace(v: string, pattern: string, replacement: string): string

+

Defined in builtin/filters/string.ts:60

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
vstring
patternstring
replacementstring
+

Returns: string

+
+

replaceFirst

replaceFirst(v: string, arg1: string, arg2: string): string

+

Defined in builtin/filters/string.ts:64

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
vstring
arg1string
arg2string
+

Returns: string

+
+

rstrip

rstrip(str: string): string

+

Defined in builtin/filters/string.ts:39

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

split

split(v: string, arg: string): string[]

+

Defined in builtin/filters/string.ts:43

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string[]

+
+

strip

strip(v: string): string

+

Defined in builtin/filters/string.ts:47

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

stripNewlines

stripNewlines(v: string): string

+

Defined in builtin/filters/string.ts:51

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

truncate

truncate(v: string, l: number, o: string): string

+

Defined in builtin/filters/string.ts:68

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vstring-
lnumber50
ostring“…”
+

Returns: string

+
+

truncatewords

truncatewords(v: string, l: number, o: string): string

+

Defined in builtin/filters/string.ts:74

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vstring-
lnumber15
ostring“…”
+

Returns: string

+
+

upcase

upcase(str: string): string

+

Defined in builtin/filters/string.ts:27

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_filters_url_.html b/api/modules/builtin_filters_url_.html new file mode 100644 index 000000000..6ffef42ad --- /dev/null +++ b/api/modules/builtin_filters_url_.html @@ -0,0 +1,209 @@ + + + + + External module: "builtin/filters/url" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/url"

+ + + +
+
+

Functions

Const urlDecode

urlDecode(x: string): string

+

Defined in builtin/filters/url.ts:1

+

Parameters:

+ + + + + + + + + + + +
NameType
xstring
+

Returns: string

+
+

Const urlEncode

urlEncode(x: string): string

+

Defined in builtin/filters/url.ts:2

+

Parameters:

+ + + + + + + + + + + +
NameType
xstring
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_assign_.html b/api/modules/builtin_tags_assign_.html new file mode 100644 index 000000000..2675d816f --- /dev/null +++ b/api/modules/builtin_tags_assign_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/assign" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_block_.html b/api/modules/builtin_tags_block_.html new file mode 100644 index 000000000..f632b46d5 --- /dev/null +++ b/api/modules/builtin_tags_block_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/block" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_break_.html b/api/modules/builtin_tags_break_.html new file mode 100644 index 000000000..446976232 --- /dev/null +++ b/api/modules/builtin_tags_break_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/break" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_capture_.html b/api/modules/builtin_tags_capture_.html new file mode 100644 index 000000000..959951466 --- /dev/null +++ b/api/modules/builtin_tags_capture_.html @@ -0,0 +1,192 @@ + + + + + External module: "builtin/tags/capture" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_case_.html b/api/modules/builtin_tags_case_.html new file mode 100644 index 000000000..95c729016 --- /dev/null +++ b/api/modules/builtin_tags_case_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/case" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_comment_.html b/api/modules/builtin_tags_comment_.html new file mode 100644 index 000000000..17f3f15bb --- /dev/null +++ b/api/modules/builtin_tags_comment_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/comment" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_continue_.html b/api/modules/builtin_tags_continue_.html new file mode 100644 index 000000000..d7d67f440 --- /dev/null +++ b/api/modules/builtin_tags_continue_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/continue" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_cycle_.html b/api/modules/builtin_tags_cycle_.html new file mode 100644 index 000000000..e9c4148ea --- /dev/null +++ b/api/modules/builtin_tags_cycle_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/cycle" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_decrement_.html b/api/modules/builtin_tags_decrement_.html new file mode 100644 index 000000000..0025cfd89 --- /dev/null +++ b/api/modules/builtin_tags_decrement_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/decrement" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_for_.html b/api/modules/builtin_tags_for_.html new file mode 100644 index 000000000..ae4b4ecd2 --- /dev/null +++ b/api/modules/builtin_tags_for_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/for" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_if_.html b/api/modules/builtin_tags_if_.html new file mode 100644 index 000000000..aaffdc66d --- /dev/null +++ b/api/modules/builtin_tags_if_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/if" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_include_.html b/api/modules/builtin_tags_include_.html new file mode 100644 index 000000000..6fa22462c --- /dev/null +++ b/api/modules/builtin_tags_include_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/include" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_increment_.html b/api/modules/builtin_tags_increment_.html new file mode 100644 index 000000000..e3fea43c9 --- /dev/null +++ b/api/modules/builtin_tags_increment_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/increment" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_index_.html b/api/modules/builtin_tags_index_.html new file mode 100644 index 000000000..1ef43e1f3 --- /dev/null +++ b/api/modules/builtin_tags_index_.html @@ -0,0 +1,229 @@ + + + + + External module: "builtin/tags/index" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/tags/index"

+ + + +
+
+

Object literals

Const tags

tags: object

Defined in builtin/tags/index.ts:21

+

assign

assign: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

block

block: object

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

break

break: object = Break

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

capture

capture: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

case

case: TagImplOptions = Case

+

Defined in builtin/tags/index.ts:22

+

comment

comment: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

continue

continue: object = Continue

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

cycle

cycle: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

decrement

decrement: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

for

for: TagImplOptions = For

+

Defined in builtin/tags/index.ts:22

+

if

if: TagImplOptions = If

+

Defined in builtin/tags/index.ts:22

+

include

include: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

increment

increment: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

layout

layout: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

raw

raw: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

render

render: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

tablerow

tablerow: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

unless

unless: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_layout_.html b/api/modules/builtin_tags_layout_.html new file mode 100644 index 000000000..47a6d0fda --- /dev/null +++ b/api/modules/builtin_tags_layout_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/layout" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_raw_.html b/api/modules/builtin_tags_raw_.html new file mode 100644 index 000000000..342f4a358 --- /dev/null +++ b/api/modules/builtin_tags_raw_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/raw" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_render_.html b/api/modules/builtin_tags_render_.html new file mode 100644 index 000000000..aeddb5b5d --- /dev/null +++ b/api/modules/builtin_tags_render_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/render" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_tablerow_.html b/api/modules/builtin_tags_tablerow_.html new file mode 100644 index 000000000..79b9d3beb --- /dev/null +++ b/api/modules/builtin_tags_tablerow_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/tablerow" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/builtin_tags_unless_.html b/api/modules/builtin_tags_unless_.html new file mode 100644 index 000000000..b12b96826 --- /dev/null +++ b/api/modules/builtin_tags_unless_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/unless" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/cache_cache_.html b/api/modules/cache_cache_.html new file mode 100644 index 000000000..600cd0fa9 --- /dev/null +++ b/api/modules/cache_cache_.html @@ -0,0 +1,176 @@ + + + + + External module: "cache/cache" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/cache_lru_.html b/api/modules/cache_lru_.html new file mode 100644 index 000000000..ea0eb6622 --- /dev/null +++ b/api/modules/cache_lru_.html @@ -0,0 +1,176 @@ + + + + + External module: "cache/lru" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/context_block_mode_.html b/api/modules/context_block_mode_.html new file mode 100644 index 000000000..7e5ee85cf --- /dev/null +++ b/api/modules/context_block_mode_.html @@ -0,0 +1,176 @@ + + + + + External module: "context/block-mode" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/context_context_.html b/api/modules/context_context_.html new file mode 100644 index 000000000..bf202309a --- /dev/null +++ b/api/modules/context_context_.html @@ -0,0 +1,247 @@ + + + + + External module: "context/context" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "context/context"

+ + + +
+
+

Functions

readFirst

readFirst(obj: Scope): any

+

Defined in context/context.ts:84

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+
+

readLast

readLast(obj: Scope): any

+

Defined in context/context.ts:89

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+
+

readProperty

readProperty(obj: Scope, key: string): any

+

Defined in context/context.ts:70

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
objScope
keystring
+

Returns: any

+
+

readSize

readSize(obj: Scope): any

+

Defined in context/context.ts:94

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/context_scope_.html b/api/modules/context_scope_.html new file mode 100644 index 000000000..dd83d4cf4 --- /dev/null +++ b/api/modules/context_scope_.html @@ -0,0 +1,178 @@ + + + + + External module: "context/scope" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_blank_drop_.html b/api/modules/drop_blank_drop_.html new file mode 100644 index 000000000..edd988654 --- /dev/null +++ b/api/modules/drop_blank_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/blank-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_block_drop_.html b/api/modules/drop_block_drop_.html new file mode 100644 index 000000000..62ec43212 --- /dev/null +++ b/api/modules/drop_block_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/block-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_comparable_.html b/api/modules/drop_comparable_.html new file mode 100644 index 000000000..814d30c18 --- /dev/null +++ b/api/modules/drop_comparable_.html @@ -0,0 +1,192 @@ + + + + + External module: "drop/comparable" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_drop_.html b/api/modules/drop_drop_.html new file mode 100644 index 000000000..a878660bc --- /dev/null +++ b/api/modules/drop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_empty_drop_.html b/api/modules/drop_empty_drop_.html new file mode 100644 index 000000000..0092ac580 --- /dev/null +++ b/api/modules/drop_empty_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/empty-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_forloop_drop_.html b/api/modules/drop_forloop_drop_.html new file mode 100644 index 000000000..c056054d3 --- /dev/null +++ b/api/modules/drop_forloop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/forloop-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_null_drop_.html b/api/modules/drop_null_drop_.html new file mode 100644 index 000000000..53cd8455c --- /dev/null +++ b/api/modules/drop_null_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/null-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/drop_tablerowloop_drop_.html b/api/modules/drop_tablerowloop_drop_.html new file mode 100644 index 000000000..9e91a67fd --- /dev/null +++ b/api/modules/drop_tablerowloop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/tablerowloop-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/fs_browser_.html b/api/modules/fs_browser_.html new file mode 100644 index 000000000..dd509bb03 --- /dev/null +++ b/api/modules/fs_browser_.html @@ -0,0 +1,289 @@ + + + + + External module: "fs/browser" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "fs/browser"

+ + + +
+
+

Functions

domResolve

domResolve(root: string, path: string): string

+

Defined in fs/browser.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
rootstring
pathstring
+

Returns: string

+
+

exists

exists(filepath: string): Promise‹boolean›

+

Defined in fs/browser.ts:56

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹boolean›

+
+

existsSync

existsSync(filepath: string): boolean

+

Defined in fs/browser.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: boolean

+
+

readFile

readFile(url: string): Promise‹string›

+

Defined in fs/browser.ts:28

+

Parameters:

+ + + + + + + + + + + +
NameType
urlstring
+

Returns: Promise‹string›

+
+

readFileSync

readFileSync(url: string): string

+

Defined in fs/browser.ts:46

+

Parameters:

+ + + + + + + + + + + +
NameType
urlstring
+

Returns: string

+
+

resolve

resolve(root: string, filepath: string, ext: string): string

+

Defined in fs/browser.ts:18

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filepathstring
extstring
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/fs_fs_.html b/api/modules/fs_fs_.html new file mode 100644 index 000000000..c5787009d --- /dev/null +++ b/api/modules/fs_fs_.html @@ -0,0 +1,176 @@ + + + + + External module: "fs/fs" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/fs_node_.html b/api/modules/fs_node_.html new file mode 100644 index 000000000..f86089fb7 --- /dev/null +++ b/api/modules/fs_node_.html @@ -0,0 +1,322 @@ + + + + + External module: "fs/node" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "fs/node"

+ + + +
+
+

Variables

Const readFileAsync

readFileAsync: function = _.promisify<string, string, string>(nodeReadFile)

+

Defined in fs/node.ts:6

+

Type declaration:

▸ (arg1: T1, arg2: T2): Promise‹T3›

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
arg1T1
arg2T2
+
+

Const statAsync

statAsync: function = _.promisify(stat)

+

Defined in fs/node.ts:5

+

Type declaration:

▸ (arg1: T1): Promise‹T2›

+

Parameters:

+ + + + + + + + + + + +
NameType
arg1T1
+

Functions

exists

exists(filepath: string): Promise‹boolean›

+

Defined in fs/node.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹boolean›

+
+

existsSync

existsSync(filepath: string): boolean

+

Defined in fs/node.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: boolean

+
+

fallback

fallback(file: string): undefined | string

+

Defined in fs/node.ts:29

+

Parameters:

+ + + + + + + + + + + +
NameType
filestring
+

Returns: undefined | string

+
+

readFile

readFile(filepath: string): Promise‹string›

+

Defined in fs/node.ts:11

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹string›

+
+

readFileSync

readFileSync(filepath: string): string

+

Defined in fs/node.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: string

+
+

resolve

resolve(root: string, file: string, ext: string): string

+

Defined in fs/node.ts:25

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filestring
extstring
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/liquid_.html b/api/modules/liquid_.html new file mode 100644 index 000000000..0d2d8396b --- /dev/null +++ b/api/modules/liquid_.html @@ -0,0 +1,176 @@ + + + + + External module: "liquid" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/liquid_options_.html b/api/modules/liquid_options_.html new file mode 100644 index 000000000..f803fcddb --- /dev/null +++ b/api/modules/liquid_options_.html @@ -0,0 +1,273 @@ + + + + + External module: "liquid-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "liquid-options"

+ + + +
+
+

Functions

applyDefault

applyDefault(options: NormalizedOptions): NormalizedFullOptions

+

Defined in liquid-options.ts:133

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedOptions
+

Returns: NormalizedFullOptions

+
+

normalize

normalize(options?: LiquidOptions): NormalizedOptions

+

Defined in liquid-options.ts:115

+

Parameters:

+ + + + + + + + + + + +
NameType
options?LiquidOptions
+

Returns: NormalizedOptions

+
+

normalizeStringArray

normalizeStringArray(value: any): string[]

+

Defined in liquid-options.ts:137

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: string[]

+

Object literals

Const defaultOptions

defaultOptions: object

Defined in liquid-options.ts:89

+

cache

cache: undefined = undefined

+

Defined in liquid-options.ts:91

+

dynamicPartials

dynamicPartials: true = true

+

Defined in liquid-options.ts:94

+

extname

extname: string = “”

+

Defined in liquid-options.ts:92

+

fs

fs: “fs/node” = fs

+

Defined in liquid-options.ts:93

+

globals

globals: object

+

Defined in liquid-options.ts:109

+

Type declaration:

greedy

greedy: true = true

+

Defined in liquid-options.ts:100

+

jsTruthy

jsTruthy: false = false

+

Defined in liquid-options.ts:95

+

keepOutputType

keepOutputType: false = false

+

Defined in liquid-options.ts:110

+

lenientIf

lenientIf: false = false

+

Defined in liquid-options.ts:108

+

operators

operators: Operators = defaultOperators

+

Defined in liquid-options.ts:111

+

operatorsTrie

operatorsTrie: Trie = createTrie(defaultOperators)

+

Defined in liquid-options.ts:112

+

outputDelimiterLeft

outputDelimiterLeft: string = “{{“

+

Defined in liquid-options.ts:103

+

outputDelimiterRight

outputDelimiterRight: string = “}}”

+

Defined in liquid-options.ts:104

+

preserveTimezones

preserveTimezones: false = false

+

Defined in liquid-options.ts:105

+

root

root: string[] = [‘.’]

+

Defined in liquid-options.ts:90

+

strictFilters

strictFilters: false = false

+

Defined in liquid-options.ts:106

+

strictVariables

strictVariables: false = false

+

Defined in liquid-options.ts:107

+

tagDelimiterLeft

tagDelimiterLeft: string = “{%“

+

Defined in liquid-options.ts:101

+

tagDelimiterRight

tagDelimiterRight: string = “%}”

+

Defined in liquid-options.ts:102

+

trimOutputLeft

trimOutputLeft: false = false

+

Defined in liquid-options.ts:99

+

trimOutputRight

trimOutputRight: false = false

+

Defined in liquid-options.ts:98

+

trimTagLeft

trimTagLeft: false = false

+

Defined in liquid-options.ts:97

+

trimTagRight

trimTagRight: false = false

+

Defined in liquid-options.ts:96

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_filter_arg_.html b/api/modules/parser_filter_arg_.html new file mode 100644 index 000000000..bb2aeda6a --- /dev/null +++ b/api/modules/parser_filter_arg_.html @@ -0,0 +1,197 @@ + + + + + External module: "parser/filter-arg" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/filter-arg"

+ + + +
+
+

Type aliases

FilterArg

Ƭ FilterArg: ValueToken | KeyValuePair

+

Defined in parser/filter-arg.ts:6

+
+

KeyValuePair

Ƭ KeyValuePair: [undefined | string, undefined | QuotedToken | PropertyAccessToken | LiteralToken | RangeToken]

+

Defined in parser/filter-arg.ts:4

+

Functions

isKeyValuePair

isKeyValuePair(arr: FilterArg): boolean

+

Defined in parser/filter-arg.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
arrFilterArg
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_match_operator_.html b/api/modules/parser_match_operator_.html new file mode 100644 index 000000000..f7cd8642f --- /dev/null +++ b/api/modules/parser_match_operator_.html @@ -0,0 +1,209 @@ + + + + + External module: "parser/match-operator" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/match-operator"

+ + + +
+
+

Functions

matchOperator

matchOperator(str: string, begin: number, trie: Trie, end: number): number

+

Defined in parser/match-operator.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strstring-
beginnumber-
trieTrie-
endnumberstr.length
+

Returns: number

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_parse_stream_.html b/api/modules/parser_parse_stream_.html new file mode 100644 index 000000000..7babfbb9b --- /dev/null +++ b/api/modules/parser_parse_stream_.html @@ -0,0 +1,196 @@ + + + + + External module: "parser/parse-stream" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_parse_string_literal_.html b/api/modules/parser_parse_string_literal_.html new file mode 100644 index 000000000..88680a310 --- /dev/null +++ b/api/modules/parser_parse_string_literal_.html @@ -0,0 +1,227 @@ + + + + + External module: "parser/parse-string-literal" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/parse-string-literal"

+ + + +
+
+

Variables

Const rHex

rHex: RegExp = /[\da-fA-F]/

+

Defined in parser/parse-string-literal.ts:1

+
+

Const rOct

rOct: RegExp = /[0-7]/

+

Defined in parser/parse-string-literal.ts:2

+

Functions

hexVal

hexVal(c: string): number

+

Defined in parser/parse-string-literal.ts:12

+

Parameters:

+ + + + + + + + + + + +
NameType
cstring
+

Returns: number

+
+

parseStringLiteral

parseStringLiteral(str: string): string

+

Defined in parser/parse-string-literal.ts:19

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+

Object literals

Const escapeChar

escapeChar: object

Defined in parser/parse-string-literal.ts:3

+

b

b: string = “”

+

Defined in parser/parse-string-literal.ts:4

+

f

f: string = “ “

+

Defined in parser/parse-string-literal.ts:5

+

n

n: string = “

+

Defined in parser/parse-string-literal.ts:6

+

r

r: string = “

+

Defined in parser/parse-string-literal.ts:7

+

t

t: string = “ “

+

Defined in parser/parse-string-literal.ts:8

+

v

v: string = “ “

+

Defined in parser/parse-string-literal.ts:9

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_parser_.html b/api/modules/parser_parser_.html new file mode 100644 index 000000000..1ba108d8b --- /dev/null +++ b/api/modules/parser_parser_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/parser" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_token_kind_.html b/api/modules/parser_token_kind_.html new file mode 100644 index 000000000..11acc8f53 --- /dev/null +++ b/api/modules/parser_token_kind_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/token-kind" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_tokenizer_.html b/api/modules/parser_tokenizer_.html new file mode 100644 index 000000000..93e50ac52 --- /dev/null +++ b/api/modules/parser_tokenizer_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/tokenizer" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/parser_whitespace_ctrl_.html b/api/modules/parser_whitespace_ctrl_.html new file mode 100644 index 000000000..67a77334d --- /dev/null +++ b/api/modules/parser_whitespace_ctrl_.html @@ -0,0 +1,238 @@ + + + + + External module: "parser/whitespace-ctrl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/whitespace-ctrl"

+ + + +
+
+

Functions

trimLeft

trimLeft(token: Token, greedy: boolean): void

+

Defined in parser/whitespace-ctrl.ts:27

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenToken
greedyboolean
+

Returns: void

+
+

trimRight

trimRight(token: Token, greedy: boolean): void

+

Defined in parser/whitespace-ctrl.ts:34

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenToken
greedyboolean
+

Returns: void

+
+

whiteSpaceCtrl

whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void

+

Defined in parser/whitespace-ctrl.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokensToken[]
optionsNormalizedFullOptions
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/render_boolean_.html b/api/modules/render_boolean_.html new file mode 100644 index 000000000..f1006aba7 --- /dev/null +++ b/api/modules/render_boolean_.html @@ -0,0 +1,217 @@ + + + + + External module: "render/boolean" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/boolean"

+ + + +
+
+

Functions

isFalsy

isFalsy(val: any, ctx: Context): boolean

+

Defined in render/boolean.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valany
ctxContext
+

Returns: boolean

+
+

isTruthy

isTruthy(val: any, ctx: Context): boolean

+

Defined in render/boolean.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valany
ctxContext
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/render_emitter_.html b/api/modules/render_emitter_.html new file mode 100644 index 000000000..f945728bc --- /dev/null +++ b/api/modules/render_emitter_.html @@ -0,0 +1,176 @@ + + + + + External module: "render/emitter" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/render_expression_.html b/api/modules/render_expression_.html new file mode 100644 index 000000000..f793c0b74 --- /dev/null +++ b/api/modules/render_expression_.html @@ -0,0 +1,351 @@ + + + + + External module: "render/expression" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/expression"

+ + + +
+
+

Functions

evalLiteralToken

evalLiteralToken(token: LiteralToken): any

+

Defined in render/expression.ts:74

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenLiteralToken
+

Returns: any

+
+

evalNumberToken

evalNumberToken(token: NumberToken): number

+

Defined in render/expression.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenNumberToken
+

Returns: number

+
+

evalOperatorToken

evalOperatorToken(operators: Operators, token: OperatorToken, lhs: any, rhs: any, ctx: Context): boolean

+

Defined in render/expression.ts:69

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
operatorsOperators
tokenOperatorToken
lhsany
rhsany
ctxContext
+

Returns: boolean

+
+

evalPropertyAccessToken

evalPropertyAccessToken(token: PropertyAccessToken, ctx: Context, lenient: boolean): null | object

+

Defined in render/expression.ts:49

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tokenPropertyAccessToken
ctxContext
lenientboolean
+

Returns: null | object

+
+

evalQuotedToken

evalQuotedToken(token: QuotedToken): string

+

Defined in render/expression.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenQuotedToken
+

Returns: string

+
+

evalRangeToken

evalRangeToken(token: RangeToken, ctx: Context): number[]

+

Defined in render/expression.ts:78

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenRangeToken
ctxContext
+

Returns: number[]

+
+

evalToken

evalToken(token: Token | undefined, ctx: Context, lenient: boolean): any

+

Defined in render/expression.ts:40

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
tokenToken | undefined-
ctxContext-
lenientbooleanfalse
+

Returns: any

+
+

toPostfix

toPostfix(tokens: IterableIterator‹Token›): IterableIterator‹Token

+

Defined in render/expression.ts:84

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensIterableIterator‹Token
+

Returns: IterableIterator‹Token

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/render_operator_.html b/api/modules/render_operator_.html new file mode 100644 index 000000000..d4da80cf9 --- /dev/null +++ b/api/modules/render_operator_.html @@ -0,0 +1,365 @@ + + + + + External module: "render/operator" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/operator"

+ + + +
+
+

Object literals

Const defaultOperators

defaultOperators: object

Defined in render/operator.ts:10

+

!=

!=(l: any, r: any): boolean

+

Defined in render/operator.ts:16

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

<

<(l: any, r: any): boolean

+

Defined in render/operator.ts:26

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

<=

<=(l: any, r: any): boolean

+

Defined in render/operator.ts:36

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

==

==(l: any, r: any): boolean

+

Defined in render/operator.ts:11

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

>

>(l: any, r: any): boolean

+

Defined in render/operator.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

>=

>=(l: any, r: any): boolean

+

Defined in render/operator.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

and

and(l: any, r: any, ctx: Context): boolean

+

Defined in render/operator.ts:44

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lany
rany
ctxContext
+

Returns: boolean

+

contains

contains(l: any, r: any): boolean

+

Defined in render/operator.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

or

or(l: any, r: any, ctx: Context): boolean

+

Defined in render/operator.ts:45

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lany
rany
ctxContext
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/render_render_.html b/api/modules/render_render_.html new file mode 100644 index 000000000..c294562cf --- /dev/null +++ b/api/modules/render_render_.html @@ -0,0 +1,176 @@ + + + + + External module: "render/render" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_filter_filter_.html b/api/modules/template_filter_filter_.html new file mode 100644 index 000000000..0e3ab5a34 --- /dev/null +++ b/api/modules/template_filter_filter_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_filter_filter_impl_.html b/api/modules/template_filter_filter_impl_.html new file mode 100644 index 000000000..4c659aea1 --- /dev/null +++ b/api/modules/template_filter_filter_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_filter_filter_impl_options_.html b/api/modules/template_filter_filter_impl_options_.html new file mode 100644 index 000000000..26604d831 --- /dev/null +++ b/api/modules/template_filter_filter_impl_options_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-impl-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_filter_filter_map_.html b/api/modules/template_filter_filter_map_.html new file mode 100644 index 000000000..dd8df5391 --- /dev/null +++ b/api/modules/template_filter_filter_map_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-map" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_html_.html b/api/modules/template_html_.html new file mode 100644 index 000000000..590dbf8f9 --- /dev/null +++ b/api/modules/template_html_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/html" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_output_.html b/api/modules/template_output_.html new file mode 100644 index 000000000..4473353a4 --- /dev/null +++ b/api/modules/template_output_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/output" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_tag_hash_.html b/api/modules/template_tag_hash_.html new file mode 100644 index 000000000..1baca5a7f --- /dev/null +++ b/api/modules/template_tag_hash_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/hash" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_tag_tag_.html b/api/modules/template_tag_tag_.html new file mode 100644 index 000000000..ae60b44aa --- /dev/null +++ b/api/modules/template_tag_tag_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_tag_tag_impl_.html b/api/modules/template_tag_tag_impl_.html new file mode 100644 index 000000000..7269afc63 --- /dev/null +++ b/api/modules/template_tag_tag_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_tag_tag_impl_options_.html b/api/modules/template_tag_tag_impl_options_.html new file mode 100644 index 000000000..eb5b24b6c --- /dev/null +++ b/api/modules/template_tag_tag_impl_options_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-impl-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_tag_tag_map_.html b/api/modules/template_tag_tag_map_.html new file mode 100644 index 000000000..88376f5fb --- /dev/null +++ b/api/modules/template_tag_tag_map_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-map" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_template_.html b/api/modules/template_template_.html new file mode 100644 index 000000000..d590e401b --- /dev/null +++ b/api/modules/template_template_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/template" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_template_impl_.html b/api/modules/template_template_impl_.html new file mode 100644 index 000000000..72fc76071 --- /dev/null +++ b/api/modules/template_template_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/template-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/template_value_.html b/api/modules/template_value_.html new file mode 100644 index 000000000..35867e6b2 --- /dev/null +++ b/api/modules/template_value_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/value" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_delimited_token_.html b/api/modules/tokens_delimited_token_.html new file mode 100644 index 000000000..5260d8a3d --- /dev/null +++ b/api/modules/tokens_delimited_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/delimited-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_filter_token_.html b/api/modules/tokens_filter_token_.html new file mode 100644 index 000000000..c01e70541 --- /dev/null +++ b/api/modules/tokens_filter_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/filter-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_hash_token_.html b/api/modules/tokens_hash_token_.html new file mode 100644 index 000000000..41aa47865 --- /dev/null +++ b/api/modules/tokens_hash_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/hash-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_html_token_.html b/api/modules/tokens_html_token_.html new file mode 100644 index 000000000..0c31f30d2 --- /dev/null +++ b/api/modules/tokens_html_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/html-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_identifier_token_.html b/api/modules/tokens_identifier_token_.html new file mode 100644 index 000000000..e01f43059 --- /dev/null +++ b/api/modules/tokens_identifier_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/identifier-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_literal_token_.html b/api/modules/tokens_literal_token_.html new file mode 100644 index 000000000..72d5e6709 --- /dev/null +++ b/api/modules/tokens_literal_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/literal-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_number_token_.html b/api/modules/tokens_number_token_.html new file mode 100644 index 000000000..180f8fa1b --- /dev/null +++ b/api/modules/tokens_number_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/number-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_operator_token_.html b/api/modules/tokens_operator_token_.html new file mode 100644 index 000000000..20ec20672 --- /dev/null +++ b/api/modules/tokens_operator_token_.html @@ -0,0 +1,195 @@ + + + + + External module: "tokens/operator-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "tokens/operator-token"

+ + + +
+
+

Object literals

Const precedence

precedence: object

Defined in tokens/operator-token.ts:4

+

!=

!=: number = 1

+

Defined in tokens/operator-token.ts:6

+

<

<: number = 1

+

Defined in tokens/operator-token.ts:8

+

<=

<=: number = 1

+

Defined in tokens/operator-token.ts:10

+

==

==: number = 1

+

Defined in tokens/operator-token.ts:5

+

>

>: number = 1

+

Defined in tokens/operator-token.ts:7

+

>=

>=: number = 1

+

Defined in tokens/operator-token.ts:9

+

and

and: number = 0

+

Defined in tokens/operator-token.ts:12

+

contains

contains: number = 1

+

Defined in tokens/operator-token.ts:11

+

or

or: number = 0

+

Defined in tokens/operator-token.ts:13

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_output_token_.html b/api/modules/tokens_output_token_.html new file mode 100644 index 000000000..855a09374 --- /dev/null +++ b/api/modules/tokens_output_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/output-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_property_access_token_.html b/api/modules/tokens_property_access_token_.html new file mode 100644 index 000000000..ec2736b6b --- /dev/null +++ b/api/modules/tokens_property_access_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/property-access-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_quoted_token_.html b/api/modules/tokens_quoted_token_.html new file mode 100644 index 000000000..0f32e7c21 --- /dev/null +++ b/api/modules/tokens_quoted_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/quoted-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_range_token_.html b/api/modules/tokens_range_token_.html new file mode 100644 index 000000000..a3ebcbe16 --- /dev/null +++ b/api/modules/tokens_range_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/range-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_tag_token_.html b/api/modules/tokens_tag_token_.html new file mode 100644 index 000000000..09aa95b8c --- /dev/null +++ b/api/modules/tokens_tag_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/tag-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_token_.html b/api/modules/tokens_token_.html new file mode 100644 index 000000000..d3ac5a80d --- /dev/null +++ b/api/modules/tokens_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_toplevel_token_.html b/api/modules/tokens_toplevel_token_.html new file mode 100644 index 000000000..8963d63eb --- /dev/null +++ b/api/modules/tokens_toplevel_token_.html @@ -0,0 +1,178 @@ + + + + + External module: "tokens/toplevel-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/tokens_value_token_.html b/api/modules/tokens_value_token_.html new file mode 100644 index 000000000..6e687cebd --- /dev/null +++ b/api/modules/tokens_value_token_.html @@ -0,0 +1,178 @@ + + + + + External module: "tokens/value-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/types_.html b/api/modules/types_.html new file mode 100644 index 000000000..06091aec5 --- /dev/null +++ b/api/modules/types_.html @@ -0,0 +1,176 @@ + + + + + External module: "types" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_assert_.html b/api/modules/util_assert_.html new file mode 100644 index 000000000..e6e8b6836 --- /dev/null +++ b/api/modules/util_assert_.html @@ -0,0 +1,198 @@ + + + + + External module: "util/assert" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/assert"

+ + + +
+
+

Functions

assert

assert<T>(predicate: T | null | undefined, message?: undefined | function): void

+

Defined in util/assert.ts:3

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
predicateT | null | undefined
message?undefined | function
+

Returns: void

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_async_.html b/api/modules/util_async_.html new file mode 100644 index 000000000..8a8234b82 --- /dev/null +++ b/api/modules/util_async_.html @@ -0,0 +1,310 @@ + + + + + External module: "util/async" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/async"

+ + + +
+
+

Type aliases

resolver

Ƭ resolver: function

+

Defined in util/async.ts:3

+

Type declaration:

▸ (x?: any): any

+

Parameters:

+ + + + + + + + + + + +
NameType
x?any
+

Functions

createRejectedThenable

createRejectedThenable(err: Error): Thenable

+

Defined in util/async.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
errError
+

Returns: Thenable

+
+

createResolvedThenable

createResolvedThenable(value: any): Thenable

+

Defined in util/async.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: Thenable

+
+

isAsyncIterator

isAsyncIterator(val: any): boolean

+

Defined in util/async.ts:33

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isThenable

isThenable(val: any): boolean

+

Defined in util/async.ts:29

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

toPromise

toPromise(val: IterableIterator‹any› | Thenable | any): Promise‹any›

+

Defined in util/async.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: Promise‹any›

+
+

toThenable

toThenable(val: IterableIterator‹any› | Thenable | any): Thenable

+

Defined in util/async.ts:38

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: Thenable

+
+

toValue

toValue(val: IterableIterator‹any› | Thenable | any): any

+

Defined in util/async.ts:70

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_character_.html b/api/modules/util_character_.html new file mode 100644 index 000000000..0fb77040f --- /dev/null +++ b/api/modules/util_character_.html @@ -0,0 +1,199 @@ + + + + + External module: "util/character" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/character"

+ + + +
+
+

Variables

Const BLANK

BLANK: 4 = 4

+

Defined in util/character.ts:8

+
+

Const IDENTIFIER

IDENTIFIER: 1 = 1

+

Defined in util/character.ts:6

+
+

Const INLINE_BLANK

INLINE_BLANK: 16 = 16

+

Defined in util/character.ts:10

+
+

Const NUMBER

NUMBER: 32 = 32

+

Defined in util/character.ts:11

+
+

Const OPERATOR

OPERATOR: 2 = 2

+

Defined in util/character.ts:7

+
+

Const QUOTE

QUOTE: 8 = 8

+

Defined in util/character.ts:9

+
+

Const SIGN

SIGN: 64 = 64

+

Defined in util/character.ts:12

+
+

Const TYPES

TYPES: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

+

Defined in util/character.ts:5

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_collection_.html b/api/modules/util_collection_.html new file mode 100644 index 000000000..5a0ab3a43 --- /dev/null +++ b/api/modules/util_collection_.html @@ -0,0 +1,209 @@ + + + + + External module: "util/collection" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/collection"

+ + + +
+
+

Functions

toArray

toArray(val: any): any[]

+

Defined in util/collection.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any[]

+
+

toEnumerable

toEnumerable(val: any): any[]

+

Defined in util/collection.ts:3

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any[]

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_error_.html b/api/modules/util_error_.html new file mode 100644 index 000000000..1049047ef --- /dev/null +++ b/api/modules/util_error_.html @@ -0,0 +1,213 @@ + + + + + External module: "util/error" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/error"

+ + + +
+
+

Functions

mkContext

mkContext(token: Token): string

+

Defined in util/error.ts:82

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenToken
+

Returns: string

+
+

mkMessage

mkMessage(msg: string, token: Token): string

+

Defined in util/error.ts:101

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
msgstring
tokenToken
+

Returns: string

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_literal_.html b/api/modules/util_literal_.html new file mode 100644 index 000000000..4850bd2bb --- /dev/null +++ b/api/modules/util_literal_.html @@ -0,0 +1,191 @@ + + + + + External module: "util/literal" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/literal"

+ + + +
+
+

Variables

Const nil

nil: NullDrop = new NullDrop()

+

Defined in util/literal.ts:5

+

Object literals

Const literalValues

literalValues: object

Defined in util/literal.ts:6

+

blank

blank: BlankDrop = new BlankDrop()

+

Defined in util/literal.ts:12

+

empty

empty: EmptyDrop = new EmptyDrop()

+

Defined in util/literal.ts:11

+

false

false: boolean = false

+

Defined in util/literal.ts:8

+

nil

nil: NullDrop = nil

+

Defined in util/literal.ts:9

+

null

null: NullDrop = nil

+

Defined in util/literal.ts:10

+

true

true: boolean = true

+

Defined in util/literal.ts:7

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_operator_trie_.html b/api/modules/util_operator_trie_.html new file mode 100644 index 000000000..2dad128d6 --- /dev/null +++ b/api/modules/util_operator_trie_.html @@ -0,0 +1,192 @@ + + + + + External module: "util/operator-trie" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_strftime_.html b/api/modules/util_strftime_.html new file mode 100644 index 000000000..82317c0e0 --- /dev/null +++ b/api/modules/util_strftime_.html @@ -0,0 +1,928 @@ + + + + + External module: "util/strftime" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/strftime"

+ + + +
+
+

Variables

Const dayNames

dayNames: string[] = [
‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’
]

+

Defined in util/strftime.ts:8

+
+

Const dayNamesShort

dayNamesShort: string[] = dayNames.map(abbr)

+

Defined in util/strftime.ts:12

+
+

Const monthNames

monthNames: string[] = [
‘January’, ‘February’, ‘March’, ‘April’, ‘May’, ‘June’, ‘July’, ‘August’,
‘September’, ‘October’, ‘November’, ‘December’
]

+

Defined in util/strftime.ts:4

+
+

Const monthNamesShort

monthNamesShort: string[] = monthNames.map(abbr)

+

Defined in util/strftime.ts:11

+
+

Const rFormat

rFormat: RegExp = /%([-_0^#:]+)?(\d+)?([EO])?(.)/

+

Defined in util/strftime.ts:3

+

Functions

abbr

abbr(str: string): string

+

Defined in util/strftime.ts:25

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

century

century(d: Date): number

+

Defined in util/strftime.ts:58

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+
+

daysInMonth

daysInMonth(d: Date): number[]

+

Defined in util/strftime.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number[]

+
+

default

default(inputDate: Date, formatStr: string): string

+

Defined in util/strftime.ts:141

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
inputDateDate
formatStrstring
+

Returns: string

+
+

format

format(d: Date, match: RegExpExecArray): any

+

Defined in util/strftime.ts:160

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
matchRegExpExecArray
+

Returns: any

+
+

getDayOfYear

getDayOfYear(d: Date): number

+

Defined in util/strftime.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+
+

getSuffix

getSuffix(d: Date): any

+

Defined in util/strftime.ts:53

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: any

+
+

getWeekOfYear

getWeekOfYear(d: Date, startDay: number): string

+

Defined in util/strftime.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
startDaynumber
+

Returns: string

+
+

isLeapYear

isLeapYear(d: Date): boolean

+

Defined in util/strftime.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: boolean

+

Object literals

Const formatCodes

formatCodes: object

Defined in util/strftime.ts:92

+

%

%(): string

+

Defined in util/strftime.ts:139

+

Returns: string

+

A

A(d: Date): string

+

Defined in util/strftime.ts:94

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

B

B(d: Date): string

+

Defined in util/strftime.ts:96

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

C

C(d: Date): number

+

Defined in util/strftime.ts:98

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

H

H(d: Date): number

+

Defined in util/strftime.ts:101

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

I

I(d: Date): string

+

Defined in util/strftime.ts:102

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

L

L(d: Date): number

+

Defined in util/strftime.ts:106

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

M

M(d: Date): number

+

Defined in util/strftime.ts:108

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

N

N(d: Date, opts: FormatOptions): any

+

Defined in util/strftime.ts:109

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
optsFormatOptions
+

Returns: any

+

P

P(d: Date): *”am” | “pm”*

+

Defined in util/strftime.ts:115

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: *”am” | “pm”*

+

S

S(d: Date): number

+

Defined in util/strftime.ts:118

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

U

U(d: Date): string

+

Defined in util/strftime.ts:120

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

W

W(d: Date): string

+

Defined in util/strftime.ts:122

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

X

X(d: Date): string

+

Defined in util/strftime.ts:124

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

Y

Y(d: Date): number

+

Defined in util/strftime.ts:126

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

a

a(d: Date): string

+

Defined in util/strftime.ts:93

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

b

b(d: Date): string

+

Defined in util/strftime.ts:95

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

c

c(d: Date): string

+

Defined in util/strftime.ts:97

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

d

d(d: Date): number

+

Defined in util/strftime.ts:99

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

e

e(d: Date): number

+

Defined in util/strftime.ts:100

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

j

j(d: Date): number

+

Defined in util/strftime.ts:103

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

k

k(d: Date): number

+

Defined in util/strftime.ts:104

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

l

l(d: Date): string

+

Defined in util/strftime.ts:105

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

m

m(d: Date): number

+

Defined in util/strftime.ts:107

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

n

n(): string

+

Defined in util/strftime.ts:138

+

Returns: string

+

p

p(d: Date): *”AM” | “PM”*

+

Defined in util/strftime.ts:114

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: *”AM” | “PM”*

+

q

q(d: Date): any

+

Defined in util/strftime.ts:116

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: any

+

s

s(d: Date): number

+

Defined in util/strftime.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

t

t(): string

+

Defined in util/strftime.ts:137

+

Returns: string

+

u

u(d: Date): number

+

Defined in util/strftime.ts:119

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

w

w(d: Date): number

+

Defined in util/strftime.ts:121

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

x

x(d: Date): string

+

Defined in util/strftime.ts:123

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

y

y(d: Date): string

+

Defined in util/strftime.ts:125

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

z

z(d: Date, opts: FormatOptions): string

+

Defined in util/strftime.ts:127

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
optsFormatOptions
+

Returns: string

+
+

Const padChars

padChars: object

Defined in util/strftime.ts:80

+

A

A: string = “ “

+

Defined in util/strftime.ts:82

+

B

B: string = “ “

+

Defined in util/strftime.ts:84

+

P

P: string = “ “

+

Defined in util/strftime.ts:90

+

a

a: string = “ “

+

Defined in util/strftime.ts:81

+

b

b: string = “ “

+

Defined in util/strftime.ts:83

+

c

c: string = “ “

+

Defined in util/strftime.ts:85

+

e

e: string = “ “

+

Defined in util/strftime.ts:86

+

k

k: string = “ “

+

Defined in util/strftime.ts:87

+

l

l: string = “ “

+

Defined in util/strftime.ts:88

+

p

p: string = “ “

+

Defined in util/strftime.ts:89

+
+

Const padWidths

padWidths: object

Defined in util/strftime.ts:63

+

H

H: number = 2

+

Defined in util/strftime.ts:66

+

I

I: number = 2

+

Defined in util/strftime.ts:67

+

L

L: number = 3

+

Defined in util/strftime.ts:71

+

M

M: number = 2

+

Defined in util/strftime.ts:73

+

S

S: number = 2

+

Defined in util/strftime.ts:74

+

U

U: number = 2

+

Defined in util/strftime.ts:75

+

W

W: number = 2

+

Defined in util/strftime.ts:76

+

d

d: number = 2

+

Defined in util/strftime.ts:64

+

e

e: number = 2

+

Defined in util/strftime.ts:65

+

j

j: number = 3

+

Defined in util/strftime.ts:68

+

k

k: number = 2

+

Defined in util/strftime.ts:69

+

l

l: number = 2

+

Defined in util/strftime.ts:70

+

m

m: number = 2

+

Defined in util/strftime.ts:72

+
+

Const suffixes

suffixes: object

Defined in util/strftime.ts:13

+

1

1: string = “st”

+

Defined in util/strftime.ts:14

+

2

2: string = “nd”

+

Defined in util/strftime.ts:15

+

3

3: string = “rd”

+

Defined in util/strftime.ts:16

+

default

default: string = “th”

+

Defined in util/strftime.ts:17

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_type_guards_.html b/api/modules/util_type_guards_.html new file mode 100644 index 000000000..94b0b94de --- /dev/null +++ b/api/modules/util_type_guards_.html @@ -0,0 +1,379 @@ + + + + + External module: "util/type-guards" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/type-guards"

+ + + +
+
+

Functions

getKind

getKind(val: any): any

+

Defined in util/type-guards.ts:58

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any

+
+

isDelimitedToken

isDelimitedToken(val: any): boolean

+

Defined in util/type-guards.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isHTMLToken

isHTMLToken(val: any): boolean

+

Defined in util/type-guards.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isLiteralToken

isLiteralToken(val: any): boolean

+

Defined in util/type-guards.ts:38

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isNumberToken

isNumberToken(val: any): boolean

+

Defined in util/type-guards.ts:42

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isOperatorToken

isOperatorToken(val: any): boolean

+

Defined in util/type-guards.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isOutputToken

isOutputToken(val: any): boolean

+

Defined in util/type-guards.ts:26

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isPropertyAccessToken

isPropertyAccessToken(val: any): boolean

+

Defined in util/type-guards.ts:46

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isQuotedToken

isQuotedToken(val: any): boolean

+

Defined in util/type-guards.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isRangeToken

isRangeToken(val: any): boolean

+

Defined in util/type-guards.ts:54

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isTagToken

isTagToken(val: any): boolean

+

Defined in util/type-guards.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isWordToken

isWordToken(val: any): boolean

+

Defined in util/type-guards.ts:50

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/api/modules/util_underscore_.html b/api/modules/util_underscore_.html new file mode 100644 index 000000000..c507e3e38 --- /dev/null +++ b/api/modules/util_underscore_.html @@ -0,0 +1,706 @@ + + + + + External module: "util/underscore" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/underscore"

+ + + +
+
+

Variables

Const toLowerCase

toLowerCase: toLowerCase = String.prototype.toLowerCase

+

Defined in util/underscore.ts:4

+
+

Const toStr

toStr: toString = Object.prototype.toString

+

Defined in util/underscore.ts:3

+

Functions

caseInsensitiveCompare

caseInsensitiveCompare(a: any, b: any): 1 | 0 | -1

+

Defined in util/underscore.ts:140

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
aany
bany
+

Returns: 1 | 0 | -1

+
+

changeCase

changeCase(str: string): string

+

Defined in util/underscore.ts:130

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

ellipsis

ellipsis(str: string, N: number): string

+

Defined in util/underscore.ts:135

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
Nnumber
+

Returns: string

+
+

forOwn

forOwn<T>(object: object | undefined, iteratee: function): object

+

Defined in util/underscore.ts:66

+

Type parameters:

+

T

+

Parameters:

+

object: object | undefined

+

iteratee: function

+

▸ (val: T, key: string, obj: object): boolean | void

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
valT
keystring
objobject
+

Returns: object

+
    +
  • [ key: string]: T
  • +
+
+

identify

identify<T>(val: T): T

+

Defined in util/underscore.ts:119

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
valT
+

Returns: T

+
+

isArray

isArray(value: any): boolean

+

Defined in util/underscore.ts:53

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isFunction

isFunction(value: any): boolean

+

Defined in util/underscore.ts:15

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isNil

isNil(value: any): boolean

+

Defined in util/underscore.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isNumber

isNumber(value: any): boolean

+

Defined in util/underscore.ts:40

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isObject

isObject(value: any): boolean

+

Defined in util/underscore.ts:91

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isString

isString(value: any): boolean

+

Defined in util/underscore.ts:11

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

last

last<T>(arr: T[]): T

+

Defined in util/underscore.ts:79

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
arrT[]
+

Returns: T

+

last(arr: string): string

+

Defined in util/underscore.ts:80

+

Parameters:

+ + + + + + + + + + + +
NameType
arrstring
+

Returns: string

+
+

pad

pad(str: any, length: number, ch: string, add: function): any

+

Defined in util/underscore.ts:112

+

Parameters:

+

str: any

+

length: number

+

ch: string

+

add: function

+

▸ (str: string, ch: string): string

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
chstring
+

Returns: any

+
+

padEnd

padEnd(str: any, length: number, ch: string): any

+

Defined in util/underscore.ts:108

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strany-
lengthnumber-
chstring“ “
+

Returns: any

+
+

padStart

padStart(str: any, length: number, ch: string): any

+

Defined in util/underscore.ts:104

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strany-
lengthnumber-
chstring“ “
+

Returns: any

+
+

promisify

promisify<T1, T2>(fn: function): function

+

Defined in util/underscore.ts:19

+

Type parameters:

+

T1

+

T2

+

Parameters:

+

fn: function

+

▸ (arg1: T1, cb: function): void

+

Parameters:

+

arg1: T1

+

cb: function

+

▸ (err: Error | null, result: T2): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError | null
resultT2
+

Returns: function

+

▸ (arg1: T1): Promise‹T2›

+

Parameters:

+ + + + + + + + + + + +
NameType
arg1T1
+

promisify<T1, T2, T3>(fn: function): function

+

Defined in util/underscore.ts:20

+

Type parameters:

+

T1

+

T2

+

T3

+

Parameters:

+

fn: function

+

▸ (arg1: T1, arg2: T2, cb: function): void

+

Parameters:

+

arg1: T1

+

arg2: T2

+

cb: function

+

▸ (err: Error | null, result: T3): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError | null
resultT3
+

Returns: function

+

▸ (arg1: T1, arg2: T2): Promise‹T3›

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
arg1T1
arg2T2
+
+

range

range(start: number, stop: number, step: number): number[]

+

Defined in util/underscore.ts:96

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
startnumber-
stopnumber-
stepnumber1
+

Returns: number[]

+
+

snakeCase

snakeCase(str: string): string

+

Defined in util/underscore.ts:123

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

stringify

stringify(value: any): string

+

Defined in util/underscore.ts:31

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: string

+
+

toLiquid

toLiquid(value: any): any

+

Defined in util/underscore.ts:44

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: any

+
+

toValue

toValue(value: any): any

+

Defined in util/underscore.ts:36

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: any

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/assets/algolia/algoliasearch.js b/assets/algolia/algoliasearch.js new file mode 100644 index 000000000..7707138f1 --- /dev/null +++ b/assets/algolia/algoliasearch.js @@ -0,0 +1,7190 @@ +/*! algoliasearch 3.35.1 | © 2014, 2015 Algolia SAS | github.com/algolia/algoliasearch-client-js */ +(function(f){var g;if(typeof window!=='undefined'){g=window}else if(typeof self!=='undefined'){g=self}g.ALGOLIA_MIGRATION_LAYER=f()})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;owindow.ALGOLIA_SUPPORTS_DOCWRITE = true\x3C/script>'); + + if (window.ALGOLIA_SUPPORTS_DOCWRITE === true) { + document.write('\x3Cscript src="' + v2ScriptUrl + '">\x3C/script>'); + scriptLoaded('document.write')(); + } else { + loadScript(v2ScriptUrl, scriptLoaded('DOMElement')); + } + } catch (e) { + loadScript(v2ScriptUrl, scriptLoaded('DOMElement')); + } +} + +function scriptLoaded(method) { + return function log() { + var message = 'AlgoliaSearch: loaded V2 script using ' + method; + + if (window.console && window.console.log) { + window.console.log(message); + } + }; +} + +},{"1":1}],4:[function(require,module,exports){ +'use strict'; + +/* eslint no-unused-vars: [2, {"vars": "local"}] */ + +module.exports = oldGlobals; + +// put old window.AlgoliaSearch.. into window. again so that +// users upgrading to V3 without changing their code, will be warned +function oldGlobals() { + var message = '-- AlgoliaSearch V2 => V3 error --\n' + + 'You are trying to use a new version of the AlgoliaSearch JavaScript client with an old notation.\n' + + 'Please read our migration guide at https://github.com/algolia/algoliasearch-client-js/wiki/Migration-guide-from-2.x.x-to-3.x.x\n' + + '-- /AlgoliaSearch V2 => V3 error --'; + + window.AlgoliaSearch = function() { + throw new Error(message); + }; + + window.AlgoliaSearchHelper = function() { + throw new Error(message); + }; + + window.AlgoliaExplainResults = function() { + throw new Error(message); + }; +} + +},{}],5:[function(require,module,exports){ +'use strict'; + +// This script will be browserified and prepended to the normal build +// directly in window, not wrapped in any module definition +// To avoid cases where we are loaded with /latest/ along with +migrationLayer("algoliasearch"); + +// Now onto the V2 related code: +// If the client is using /latest/$BUILDNAME.min.js, load V2 of the library +// +// Otherwise, setup a migration layer that will throw on old constructors like +// new AlgoliaSearch(). +// So that users upgrading from v2 to v3 will have a clear information +// message on what to do if they did not read the migration guide +function migrationLayer(buildName) { + var isUsingLatest = require(2); + var loadV2 = require(3); + var oldGlobals = require(4); + + if (isUsingLatest(buildName)) { + loadV2(buildName); + } else { + oldGlobals(); + } +} + +},{"2":2,"3":3,"4":4}]},{},[5])(5) +});(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.algoliasearch = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { + return true; + } + + // is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +exports.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return '[UnexpectedJSONParseError]: ' + err.message; + } +}; + + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + var useColors = this.useColors; + + args[0] = (useColors ? '%c' : '') + + this.namespace + + (useColors ? ' %c' : ' ') + + args[0] + + (useColors ? '%c ' : ' ') + + '+' + exports.humanize(this.diff); + + if (!useColors) return; + + var c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit') + + // the final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ('%%' === match) return; + index++; + if ('%c' === match) { + // we only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ + +function log() { + // this hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return 'object' === typeof console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ + +function save(namespaces) { + try { + if (null == namespaces) { + exports.storage.removeItem('debug'); + } else { + exports.storage.debug = namespaces; + } + } catch(e) {} +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + var r; + try { + r = exports.storage.debug; + } catch(e) {} + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Enable namespaces listed in `localStorage.debug` initially. + */ + +exports.enable(load()); + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + return window.localStorage; + } catch (e) {} +} + +}).call(this,require(12)) +},{"12":12,"2":2}],2:[function(require,module,exports){ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + * + * Expose `debug()` as the module. + */ + +exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; +exports.coerce = coerce; +exports.disable = disable; +exports.enable = enable; +exports.enabled = enabled; +exports.humanize = require(9); + +/** + * The currently active debug mode names, and names to skip. + */ + +exports.names = []; +exports.skips = []; + +/** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + +exports.formatters = {}; + +/** + * Previous log timestamp. + */ + +var prevTime; + +/** + * Select a color. + * @param {String} namespace + * @return {Number} + * @api private + */ + +function selectColor(namespace) { + var hash = 0, i; + + for (i in namespace) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return exports.colors[Math.abs(hash) % exports.colors.length]; +} + +/** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + +function createDebug(namespace) { + + function debug() { + // disabled? + if (!debug.enabled) return; + + var self = debug; + + // set `diff` timestamp + var curr = +new Date(); + var ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + // turn the `arguments` into a proper Array + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + + args[0] = exports.coerce(args[0]); + + if ('string' !== typeof args[0]) { + // anything else let's inspect with %O + args.unshift('%O'); + } + + // apply any `formatters` transformations + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { + // if we encounter an escaped % then don't increase the array index + if (match === '%%') return match; + index++; + var formatter = exports.formatters[format]; + if ('function' === typeof formatter) { + var val = args[index]; + match = formatter.call(self, val); + + // now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // apply env-specific formatting (colors, etc.) + exports.formatArgs.call(self, args); + + var logFn = debug.log || exports.log || console.log.bind(console); + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = exports.enabled(namespace); + debug.useColors = exports.useColors(); + debug.color = selectColor(namespace); + + // env-specific initialization logic for debug instances + if ('function' === typeof exports.init) { + exports.init(debug); + } + + return debug; +} + +/** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + +function enable(namespaces) { + exports.save(namespaces); + + exports.names = []; + exports.skips = []; + + var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + var len = split.length; + + for (var i = 0; i < len; i++) { + if (!split[i]) continue; // ignore empty strings + namespaces = split[i].replace(/\*/g, '.*?'); + if (namespaces[0] === '-') { + exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + exports.names.push(new RegExp('^' + namespaces + '$')); + } + } +} + +/** + * Disable debug output. + * + * @api public + */ + +function disable() { + exports.enable(''); +} + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +function enabled(name) { + var i, len; + for (i = 0, len = exports.skips.length; i < len; i++) { + if (exports.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = exports.names.length; i < len; i++) { + if (exports.names[i].test(name)) { + return true; + } + } + return false; +} + +/** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +},{"9":9}],3:[function(require,module,exports){ +(function (process,global){ +/*! + * @overview es6-promise - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE + * @version 4.1.1 + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.ES6Promise = factory()); +}(this, (function () { 'use strict'; + +function objectOrFunction(x) { + var type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +} + +function isFunction(x) { + return typeof x === 'function'; +} + +var _isArray = undefined; +if (Array.isArray) { + _isArray = Array.isArray; +} else { + _isArray = function (x) { + return Object.prototype.toString.call(x) === '[object Array]'; + }; +} + +var isArray = _isArray; + +var len = 0; +var vertxNext = undefined; +var customSchedulerFn = undefined; + +var asap = function asap(callback, arg) { + queue[len] = callback; + queue[len + 1] = arg; + len += 2; + if (len === 2) { + // If len is 2, that means that we need to schedule an async flush. + // If additional callbacks are queued before the queue is flushed, they + // will be processed by this flush that we are scheduling. + if (customSchedulerFn) { + customSchedulerFn(flush); + } else { + scheduleFlush(); + } + } +}; + +function setScheduler(scheduleFn) { + customSchedulerFn = scheduleFn; +} + +function setAsap(asapFn) { + asap = asapFn; +} + +var browserWindow = typeof window !== 'undefined' ? window : undefined; +var browserGlobal = browserWindow || {}; +var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; +var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; + +// test for web worker but not in IE10 +var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; + +// node +function useNextTick() { + // node version 0.10.x displays a deprecation warning when nextTick is used recursively + // see https://github.com/cujojs/when/issues/410 for details + return function () { + return process.nextTick(flush); + }; +} + +// vertx +function useVertxTimer() { + if (typeof vertxNext !== 'undefined') { + return function () { + vertxNext(flush); + }; + } + + return useSetTimeout(); +} + +function useMutationObserver() { + var iterations = 0; + var observer = new BrowserMutationObserver(flush); + var node = document.createTextNode(''); + observer.observe(node, { characterData: true }); + + return function () { + node.data = iterations = ++iterations % 2; + }; +} + +// web worker +function useMessageChannel() { + var channel = new MessageChannel(); + channel.port1.onmessage = flush; + return function () { + return channel.port2.postMessage(0); + }; +} + +function useSetTimeout() { + // Store setTimeout reference so es6-promise will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var globalSetTimeout = setTimeout; + return function () { + return globalSetTimeout(flush, 1); + }; +} + +var queue = new Array(1000); +function flush() { + for (var i = 0; i < len; i += 2) { + var callback = queue[i]; + var arg = queue[i + 1]; + + callback(arg); + + queue[i] = undefined; + queue[i + 1] = undefined; + } + + len = 0; +} + +function attemptVertx() { + try { + var r = require; + var vertx = r('vertx'); + vertxNext = vertx.runOnLoop || vertx.runOnContext; + return useVertxTimer(); + } catch (e) { + return useSetTimeout(); + } +} + +var scheduleFlush = undefined; +// Decide what async method to use to triggering processing of queued callbacks: +if (isNode) { + scheduleFlush = useNextTick(); +} else if (BrowserMutationObserver) { + scheduleFlush = useMutationObserver(); +} else if (isWorker) { + scheduleFlush = useMessageChannel(); +} else if (browserWindow === undefined && typeof require === 'function') { + scheduleFlush = attemptVertx(); +} else { + scheduleFlush = useSetTimeout(); +} + +function then(onFulfillment, onRejection) { + var _arguments = arguments; + + var parent = this; + + var child = new this.constructor(noop); + + if (child[PROMISE_ID] === undefined) { + makePromise(child); + } + + var _state = parent._state; + + if (_state) { + (function () { + var callback = _arguments[_state - 1]; + asap(function () { + return invokeCallback(_state, child, callback, parent._result); + }); + })(); + } else { + subscribe(parent, child, onFulfillment, onRejection); + } + + return child; +} + +/** + `Promise.resolve` returns a promise that will become resolved with the + passed `value`. It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + resolve(1); + }); + + promise.then(function(value){ + // value === 1 + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.resolve(1); + + promise.then(function(value){ + // value === 1 + }); + ``` + + @method resolve + @static + @param {Any} value value that the returned promise will be resolved with + Useful for tooling. + @return {Promise} a promise that will become fulfilled with the given + `value` +*/ +function resolve$1(object) { + /*jshint validthis:true */ + var Constructor = this; + + if (object && typeof object === 'object' && object.constructor === Constructor) { + return object; + } + + var promise = new Constructor(noop); + resolve(promise, object); + return promise; +} + +var PROMISE_ID = Math.random().toString(36).substring(16); + +function noop() {} + +var PENDING = void 0; +var FULFILLED = 1; +var REJECTED = 2; + +var GET_THEN_ERROR = new ErrorObject(); + +function selfFulfillment() { + return new TypeError("You cannot resolve a promise with itself"); +} + +function cannotReturnOwn() { + return new TypeError('A promises callback cannot return that same promise.'); +} + +function getThen(promise) { + try { + return promise.then; + } catch (error) { + GET_THEN_ERROR.error = error; + return GET_THEN_ERROR; + } +} + +function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) { + try { + then$$1.call(value, fulfillmentHandler, rejectionHandler); + } catch (e) { + return e; + } +} + +function handleForeignThenable(promise, thenable, then$$1) { + asap(function (promise) { + var sealed = false; + var error = tryThen(then$$1, thenable, function (value) { + if (sealed) { + return; + } + sealed = true; + if (thenable !== value) { + resolve(promise, value); + } else { + fulfill(promise, value); + } + }, function (reason) { + if (sealed) { + return; + } + sealed = true; + + reject(promise, reason); + }, 'Settle: ' + (promise._label || ' unknown promise')); + + if (!sealed && error) { + sealed = true; + reject(promise, error); + } + }, promise); +} + +function handleOwnThenable(promise, thenable) { + if (thenable._state === FULFILLED) { + fulfill(promise, thenable._result); + } else if (thenable._state === REJECTED) { + reject(promise, thenable._result); + } else { + subscribe(thenable, undefined, function (value) { + return resolve(promise, value); + }, function (reason) { + return reject(promise, reason); + }); + } +} + +function handleMaybeThenable(promise, maybeThenable, then$$1) { + if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) { + handleOwnThenable(promise, maybeThenable); + } else { + if (then$$1 === GET_THEN_ERROR) { + reject(promise, GET_THEN_ERROR.error); + GET_THEN_ERROR.error = null; + } else if (then$$1 === undefined) { + fulfill(promise, maybeThenable); + } else if (isFunction(then$$1)) { + handleForeignThenable(promise, maybeThenable, then$$1); + } else { + fulfill(promise, maybeThenable); + } + } +} + +function resolve(promise, value) { + if (promise === value) { + reject(promise, selfFulfillment()); + } else if (objectOrFunction(value)) { + handleMaybeThenable(promise, value, getThen(value)); + } else { + fulfill(promise, value); + } +} + +function publishRejection(promise) { + if (promise._onerror) { + promise._onerror(promise._result); + } + + publish(promise); +} + +function fulfill(promise, value) { + if (promise._state !== PENDING) { + return; + } + + promise._result = value; + promise._state = FULFILLED; + + if (promise._subscribers.length !== 0) { + asap(publish, promise); + } +} + +function reject(promise, reason) { + if (promise._state !== PENDING) { + return; + } + promise._state = REJECTED; + promise._result = reason; + + asap(publishRejection, promise); +} + +function subscribe(parent, child, onFulfillment, onRejection) { + var _subscribers = parent._subscribers; + var length = _subscribers.length; + + parent._onerror = null; + + _subscribers[length] = child; + _subscribers[length + FULFILLED] = onFulfillment; + _subscribers[length + REJECTED] = onRejection; + + if (length === 0 && parent._state) { + asap(publish, parent); + } +} + +function publish(promise) { + var subscribers = promise._subscribers; + var settled = promise._state; + + if (subscribers.length === 0) { + return; + } + + var child = undefined, + callback = undefined, + detail = promise._result; + + for (var i = 0; i < subscribers.length; i += 3) { + child = subscribers[i]; + callback = subscribers[i + settled]; + + if (child) { + invokeCallback(settled, child, callback, detail); + } else { + callback(detail); + } + } + + promise._subscribers.length = 0; +} + +function ErrorObject() { + this.error = null; +} + +var TRY_CATCH_ERROR = new ErrorObject(); + +function tryCatch(callback, detail) { + try { + return callback(detail); + } catch (e) { + TRY_CATCH_ERROR.error = e; + return TRY_CATCH_ERROR; + } +} + +function invokeCallback(settled, promise, callback, detail) { + var hasCallback = isFunction(callback), + value = undefined, + error = undefined, + succeeded = undefined, + failed = undefined; + + if (hasCallback) { + value = tryCatch(callback, detail); + + if (value === TRY_CATCH_ERROR) { + failed = true; + error = value.error; + value.error = null; + } else { + succeeded = true; + } + + if (promise === value) { + reject(promise, cannotReturnOwn()); + return; + } + } else { + value = detail; + succeeded = true; + } + + if (promise._state !== PENDING) { + // noop + } else if (hasCallback && succeeded) { + resolve(promise, value); + } else if (failed) { + reject(promise, error); + } else if (settled === FULFILLED) { + fulfill(promise, value); + } else if (settled === REJECTED) { + reject(promise, value); + } +} + +function initializePromise(promise, resolver) { + try { + resolver(function resolvePromise(value) { + resolve(promise, value); + }, function rejectPromise(reason) { + reject(promise, reason); + }); + } catch (e) { + reject(promise, e); + } +} + +var id = 0; +function nextId() { + return id++; +} + +function makePromise(promise) { + promise[PROMISE_ID] = id++; + promise._state = undefined; + promise._result = undefined; + promise._subscribers = []; +} + +function Enumerator$1(Constructor, input) { + this._instanceConstructor = Constructor; + this.promise = new Constructor(noop); + + if (!this.promise[PROMISE_ID]) { + makePromise(this.promise); + } + + if (isArray(input)) { + this.length = input.length; + this._remaining = input.length; + + this._result = new Array(this.length); + + if (this.length === 0) { + fulfill(this.promise, this._result); + } else { + this.length = this.length || 0; + this._enumerate(input); + if (this._remaining === 0) { + fulfill(this.promise, this._result); + } + } + } else { + reject(this.promise, validationError()); + } +} + +function validationError() { + return new Error('Array Methods must be provided an Array'); +} + +Enumerator$1.prototype._enumerate = function (input) { + for (var i = 0; this._state === PENDING && i < input.length; i++) { + this._eachEntry(input[i], i); + } +}; + +Enumerator$1.prototype._eachEntry = function (entry, i) { + var c = this._instanceConstructor; + var resolve$$1 = c.resolve; + + if (resolve$$1 === resolve$1) { + var _then = getThen(entry); + + if (_then === then && entry._state !== PENDING) { + this._settledAt(entry._state, i, entry._result); + } else if (typeof _then !== 'function') { + this._remaining--; + this._result[i] = entry; + } else if (c === Promise$2) { + var promise = new c(noop); + handleMaybeThenable(promise, entry, _then); + this._willSettleAt(promise, i); + } else { + this._willSettleAt(new c(function (resolve$$1) { + return resolve$$1(entry); + }), i); + } + } else { + this._willSettleAt(resolve$$1(entry), i); + } +}; + +Enumerator$1.prototype._settledAt = function (state, i, value) { + var promise = this.promise; + + if (promise._state === PENDING) { + this._remaining--; + + if (state === REJECTED) { + reject(promise, value); + } else { + this._result[i] = value; + } + } + + if (this._remaining === 0) { + fulfill(promise, this._result); + } +}; + +Enumerator$1.prototype._willSettleAt = function (promise, i) { + var enumerator = this; + + subscribe(promise, undefined, function (value) { + return enumerator._settledAt(FULFILLED, i, value); + }, function (reason) { + return enumerator._settledAt(REJECTED, i, reason); + }); +}; + +/** + `Promise.all` accepts an array of promises, and returns a new promise which + is fulfilled with an array of fulfillment values for the passed promises, or + rejected with the reason of the first passed promise to be rejected. It casts all + elements of the passed iterable to promises as it runs this algorithm. + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = resolve(2); + let promise3 = resolve(3); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // The array here would be [ 1, 2, 3 ]; + }); + ``` + + If any of the `promises` given to `all` are rejected, the first promise + that is rejected will be given as an argument to the returned promises's + rejection handler. For example: + + Example: + + ```javascript + let promise1 = resolve(1); + let promise2 = reject(new Error("2")); + let promise3 = reject(new Error("3")); + let promises = [ promise1, promise2, promise3 ]; + + Promise.all(promises).then(function(array){ + // Code here never runs because there are rejected promises! + }, function(error) { + // error.message === "2" + }); + ``` + + @method all + @static + @param {Array} entries array of promises + @param {String} label optional string for labeling the promise. + Useful for tooling. + @return {Promise} promise that is fulfilled when all `promises` have been + fulfilled, or rejected if any of them become rejected. + @static +*/ +function all$1(entries) { + return new Enumerator$1(this, entries).promise; +} + +/** + `Promise.race` returns a new promise which is settled in the same way as the + first passed promise to settle. + + Example: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 2'); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // result === 'promise 2' because it was resolved before promise1 + // was resolved. + }); + ``` + + `Promise.race` is deterministic in that only the state of the first + settled promise matters. For example, even if other promises given to the + `promises` array argument are resolved, but the first settled promise has + become rejected before the other promises became fulfilled, the returned + promise will become rejected: + + ```javascript + let promise1 = new Promise(function(resolve, reject){ + setTimeout(function(){ + resolve('promise 1'); + }, 200); + }); + + let promise2 = new Promise(function(resolve, reject){ + setTimeout(function(){ + reject(new Error('promise 2')); + }, 100); + }); + + Promise.race([promise1, promise2]).then(function(result){ + // Code here never runs + }, function(reason){ + // reason.message === 'promise 2' because promise 2 became rejected before + // promise 1 became fulfilled + }); + ``` + + An example real-world use case is implementing timeouts: + + ```javascript + Promise.race([ajax('foo.json'), timeout(5000)]) + ``` + + @method race + @static + @param {Array} promises array of promises to observe + Useful for tooling. + @return {Promise} a promise which settles in the same way as the first passed + promise to settle. +*/ +function race$1(entries) { + /*jshint validthis:true */ + var Constructor = this; + + if (!isArray(entries)) { + return new Constructor(function (_, reject) { + return reject(new TypeError('You must pass an array to race.')); + }); + } else { + return new Constructor(function (resolve, reject) { + var length = entries.length; + for (var i = 0; i < length; i++) { + Constructor.resolve(entries[i]).then(resolve, reject); + } + }); + } +} + +/** + `Promise.reject` returns a promise rejected with the passed `reason`. + It is shorthand for the following: + + ```javascript + let promise = new Promise(function(resolve, reject){ + reject(new Error('WHOOPS')); + }); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + Instead of writing the above, your code now simply becomes the following: + + ```javascript + let promise = Promise.reject(new Error('WHOOPS')); + + promise.then(function(value){ + // Code here doesn't run because the promise is rejected! + }, function(reason){ + // reason.message === 'WHOOPS' + }); + ``` + + @method reject + @static + @param {Any} reason value that the returned promise will be rejected with. + Useful for tooling. + @return {Promise} a promise rejected with the given `reason`. +*/ +function reject$1(reason) { + /*jshint validthis:true */ + var Constructor = this; + var promise = new Constructor(noop); + reject(promise, reason); + return promise; +} + +function needsResolver() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); +} + +function needsNew() { + throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); +} + +/** + Promise objects represent the eventual result of an asynchronous operation. The + primary way of interacting with a promise is through its `then` method, which + registers callbacks to receive either a promise's eventual value or the reason + why the promise cannot be fulfilled. + + Terminology + ----------- + + - `promise` is an object or function with a `then` method whose behavior conforms to this specification. + - `thenable` is an object or function that defines a `then` method. + - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). + - `exception` is a value that is thrown using the throw statement. + - `reason` is a value that indicates why a promise was rejected. + - `settled` the final resting state of a promise, fulfilled or rejected. + + A promise can be in one of three states: pending, fulfilled, or rejected. + + Promises that are fulfilled have a fulfillment value and are in the fulfilled + state. Promises that are rejected have a rejection reason and are in the + rejected state. A fulfillment value is never a thenable. + + Promises can also be said to *resolve* a value. If this value is also a + promise, then the original promise's settled state will match the value's + settled state. So a promise that *resolves* a promise that rejects will + itself reject, and a promise that *resolves* a promise that fulfills will + itself fulfill. + + + Basic Usage: + ------------ + + ```js + let promise = new Promise(function(resolve, reject) { + // on success + resolve(value); + + // on failure + reject(reason); + }); + + promise.then(function(value) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Advanced Usage: + --------------- + + Promises shine when abstracting away asynchronous interactions such as + `XMLHttpRequest`s. + + ```js + function getJSON(url) { + return new Promise(function(resolve, reject){ + let xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + xhr.onreadystatechange = handler; + xhr.responseType = 'json'; + xhr.setRequestHeader('Accept', 'application/json'); + xhr.send(); + + function handler() { + if (this.readyState === this.DONE) { + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); + } + } + }; + }); + } + + getJSON('/posts.json').then(function(json) { + // on fulfillment + }, function(reason) { + // on rejection + }); + ``` + + Unlike callbacks, promises are great composable primitives. + + ```js + Promise.all([ + getJSON('/posts'), + getJSON('/comments') + ]).then(function(values){ + values[0] // => postsJSON + values[1] // => commentsJSON + + return values; + }); + ``` + + @class Promise + @param {function} resolver + Useful for tooling. + @constructor +*/ +function Promise$2(resolver) { + this[PROMISE_ID] = nextId(); + this._result = this._state = undefined; + this._subscribers = []; + + if (noop !== resolver) { + typeof resolver !== 'function' && needsResolver(); + this instanceof Promise$2 ? initializePromise(this, resolver) : needsNew(); + } +} + +Promise$2.all = all$1; +Promise$2.race = race$1; +Promise$2.resolve = resolve$1; +Promise$2.reject = reject$1; +Promise$2._setScheduler = setScheduler; +Promise$2._setAsap = setAsap; +Promise$2._asap = asap; + +Promise$2.prototype = { + constructor: Promise$2, + + /** + The primary way of interacting with a promise is through its `then` method, + which registers callbacks to receive either a promise's eventual value or the + reason why the promise cannot be fulfilled. + + ```js + findUser().then(function(user){ + // user is available + }, function(reason){ + // user is unavailable, and you are given the reason why + }); + ``` + + Chaining + -------- + + The return value of `then` is itself a promise. This second, 'downstream' + promise is resolved with the return value of the first promise's fulfillment + or rejection handler, or rejected if the handler throws an exception. + + ```js + findUser().then(function (user) { + return user.name; + }, function (reason) { + return 'default name'; + }).then(function (userName) { + // If `findUser` fulfilled, `userName` will be the user's name, otherwise it + // will be `'default name'` + }); + + findUser().then(function (user) { + throw new Error('Found user, but still unhappy'); + }, function (reason) { + throw new Error('`findUser` rejected and we're unhappy'); + }).then(function (value) { + // never reached + }, function (reason) { + // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. + // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. + }); + ``` + If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. + + ```js + findUser().then(function (user) { + throw new PedagogicalException('Upstream error'); + }).then(function (value) { + // never reached + }).then(function (value) { + // never reached + }, function (reason) { + // The `PedgagocialException` is propagated all the way down to here + }); + ``` + + Assimilation + ------------ + + Sometimes the value you want to propagate to a downstream promise can only be + retrieved asynchronously. This can be achieved by returning a promise in the + fulfillment or rejection handler. The downstream promise will then be pending + until the returned promise is settled. This is called *assimilation*. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // The user's comments are now available + }); + ``` + + If the assimliated promise rejects, then the downstream promise will also reject. + + ```js + findUser().then(function (user) { + return findCommentsByAuthor(user); + }).then(function (comments) { + // If `findCommentsByAuthor` fulfills, we'll have the value here + }, function (reason) { + // If `findCommentsByAuthor` rejects, we'll have the reason here + }); + ``` + + Simple Example + -------------- + + Synchronous Example + + ```javascript + let result; + + try { + result = findResult(); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + findResult(function(result, err){ + if (err) { + // failure + } else { + // success + } + }); + ``` + + Promise Example; + + ```javascript + findResult().then(function(result){ + // success + }, function(reason){ + // failure + }); + ``` + + Advanced Example + -------------- + + Synchronous Example + + ```javascript + let author, books; + + try { + author = findAuthor(); + books = findBooksByAuthor(author); + // success + } catch(reason) { + // failure + } + ``` + + Errback Example + + ```js + + function foundBooks(books) { + + } + + function failure(reason) { + + } + + findAuthor(function(author, err){ + if (err) { + failure(err); + // failure + } else { + try { + findBoooksByAuthor(author, function(books, err) { + if (err) { + failure(err); + } else { + try { + foundBooks(books); + } catch(reason) { + failure(reason); + } + } + }); + } catch(error) { + failure(err); + } + // success + } + }); + ``` + + Promise Example; + + ```javascript + findAuthor(). + then(findBooksByAuthor). + then(function(books){ + // found books + }).catch(function(reason){ + // something went wrong + }); + ``` + + @method then + @param {Function} onFulfilled + @param {Function} onRejected + Useful for tooling. + @return {Promise} + */ + then: then, + + /** + `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same + as the catch block of a try/catch statement. + + ```js + function findAuthor(){ + throw new Error('couldn't find that author'); + } + + // synchronous + try { + findAuthor(); + } catch(reason) { + // something went wrong + } + + // async with promises + findAuthor().catch(function(reason){ + // something went wrong + }); + ``` + + @method catch + @param {Function} onRejection + Useful for tooling. + @return {Promise} + */ + 'catch': function _catch(onRejection) { + return this.then(null, onRejection); + } +}; + +/*global self*/ +function polyfill$1() { + var local = undefined; + + if (typeof global !== 'undefined') { + local = global; + } else if (typeof self !== 'undefined') { + local = self; + } else { + try { + local = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + } + + var P = local.Promise; + + if (P) { + var promiseToString = null; + try { + promiseToString = Object.prototype.toString.call(P.resolve()); + } catch (e) { + // silently ignored + } + + if (promiseToString === '[object Promise]' && !P.cast) { + return; + } + } + + local.Promise = Promise$2; +} + +// Strange compat.. +Promise$2.polyfill = polyfill$1; +Promise$2.Promise = Promise$2; + +return Promise$2; + +}))); + + + +}).call(this,require(12),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"12":12}],4:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; + + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; + +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],5:[function(require,module,exports){ + +var hasOwn = Object.prototype.hasOwnProperty; +var toString = Object.prototype.toString; + +module.exports = function forEach (obj, fn, ctx) { + if (toString.call(fn) !== '[object Function]') { + throw new TypeError('iterator must be a function'); + } + var l = obj.length; + if (l === +l) { + for (var i = 0; i < l; i++) { + fn.call(ctx, obj[i], i, obj); + } + } else { + for (var k in obj) { + if (hasOwn.call(obj, k)) { + fn.call(ctx, obj[k], k, obj); + } + } + } +}; + + +},{}],6:[function(require,module,exports){ +(function (global){ +var win; + +if (typeof window !== "undefined") { + win = window; +} else if (typeof global !== "undefined") { + win = global; +} else if (typeof self !== "undefined"){ + win = self; +} else { + win = {}; +} + +module.exports = win; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],7:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],8:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],9:[function(require,module,exports){ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isNaN(val) === false) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + if (ms >= d) { + return Math.round(ms / d) + 'd'; + } + if (ms >= h) { + return Math.round(ms / h) + 'h'; + } + if (ms >= m) { + return Math.round(ms / m) + 'm'; + } + if (ms >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + return plural(ms, d, 'day') || + plural(ms, h, 'hour') || + plural(ms, m, 'minute') || + plural(ms, s, 'second') || + ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, n, name) { + if (ms < n) { + return; + } + if (ms < n * 1.5) { + return Math.floor(ms / n) + ' ' + name; + } + return Math.ceil(ms / n) + ' ' + name + 's'; +} + +},{}],10:[function(require,module,exports){ +'use strict'; + +// modified from https://github.com/es-shims/es5-shim +var has = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; +var slice = Array.prototype.slice; +var isArgs = require(11); +var isEnumerable = Object.prototype.propertyIsEnumerable; +var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString'); +var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype'); +var dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' +]; +var equalsConstructorPrototype = function (o) { + var ctor = o.constructor; + return ctor && ctor.prototype === o; +}; +var excludedKeys = { + $console: true, + $external: true, + $frame: true, + $frameElement: true, + $frames: true, + $innerHeight: true, + $innerWidth: true, + $outerHeight: true, + $outerWidth: true, + $pageXOffset: true, + $pageYOffset: true, + $parent: true, + $scrollLeft: true, + $scrollTop: true, + $scrollX: true, + $scrollY: true, + $self: true, + $webkitIndexedDB: true, + $webkitStorageInfo: true, + $window: true +}; +var hasAutomationEqualityBug = (function () { + /* global window */ + if (typeof window === 'undefined') { return false; } + for (var k in window) { + try { + if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') { + try { + equalsConstructorPrototype(window[k]); + } catch (e) { + return true; + } + } + } catch (e) { + return true; + } + } + return false; +}()); +var equalsConstructorPrototypeIfNotBuggy = function (o) { + /* global window */ + if (typeof window === 'undefined' || !hasAutomationEqualityBug) { + return equalsConstructorPrototype(o); + } + try { + return equalsConstructorPrototype(o); + } catch (e) { + return false; + } +}; + +var keysShim = function keys(object) { + var isObject = object !== null && typeof object === 'object'; + var isFunction = toStr.call(object) === '[object Function]'; + var isArguments = isArgs(object); + var isString = isObject && toStr.call(object) === '[object String]'; + var theKeys = []; + + if (!isObject && !isFunction && !isArguments) { + throw new TypeError('Object.keys called on a non-object'); + } + + var skipProto = hasProtoEnumBug && isFunction; + if (isString && object.length > 0 && !has.call(object, 0)) { + for (var i = 0; i < object.length; ++i) { + theKeys.push(String(i)); + } + } + + if (isArguments && object.length > 0) { + for (var j = 0; j < object.length; ++j) { + theKeys.push(String(j)); + } + } else { + for (var name in object) { + if (!(skipProto && name === 'prototype') && has.call(object, name)) { + theKeys.push(String(name)); + } + } + } + + if (hasDontEnumBug) { + var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object); + + for (var k = 0; k < dontEnums.length; ++k) { + if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) { + theKeys.push(dontEnums[k]); + } + } + } + return theKeys; +}; + +keysShim.shim = function shimObjectKeys() { + if (Object.keys) { + var keysWorksWithArguments = (function () { + // Safari 5.0 bug + return (Object.keys(arguments) || '').length === 2; + }(1, 2)); + if (!keysWorksWithArguments) { + var originalKeys = Object.keys; + Object.keys = function keys(object) { + if (isArgs(object)) { + return originalKeys(slice.call(object)); + } else { + return originalKeys(object); + } + }; + } + } else { + Object.keys = keysShim; + } + return Object.keys || keysShim; +}; + +module.exports = keysShim; + +},{"11":11}],11:[function(require,module,exports){ +'use strict'; + +var toStr = Object.prototype.toString; + +module.exports = function isArguments(value) { + var str = toStr.call(value); + var isArgs = str === '[object Arguments]'; + if (!isArgs) { + isArgs = str !== '[object Array]' && + value !== null && + typeof value === 'object' && + typeof value.length === 'number' && + value.length >= 0 && + toStr.call(value.callee) === '[object Function]'; + } + return isArgs; +}; + +},{}],12:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],13:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +// If obj.hasOwnProperty has been overridden, then calling +// obj.hasOwnProperty(prop) will break. +// See: https://github.com/joyent/node/issues/1707 +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } +}; + +module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map(objectKeys(obj), function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (isArray(obj[k])) { + return map(obj[k], function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +function map (xs, f) { + if (xs.map) return xs.map(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + return res; +} + +var objectKeys = Object.keys || function (obj) { + var res = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + return res; +}; + +},{}],15:[function(require,module,exports){ +'use strict'; + +exports.decode = exports.parse = require(13); +exports.encode = exports.stringify = require(14); + +},{"13":13,"14":14}],16:[function(require,module,exports){ +module.exports = AlgoliaSearch; + +var Index = require(18); +var deprecate = require(28); +var deprecatedMessage = require(29); +var AlgoliaSearchCore = require(17); +var inherits = require(7); +var errors = require(30); + +function AlgoliaSearch() { + AlgoliaSearchCore.apply(this, arguments); +} + +inherits(AlgoliaSearch, AlgoliaSearchCore); + +/* + * Delete an index + * + * @param indexName the name of index to delete + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer that contains the task ID + */ +AlgoliaSearch.prototype.deleteIndex = function(indexName, callback) { + return this._jsonRequest({ + method: 'DELETE', + url: '/1/indexes/' + encodeURIComponent(indexName), + hostType: 'write', + callback: callback + }); +}; + +/** + * Move an existing index. + * @param srcIndexName the name of index to copy. + * @param dstIndexName the new index name that will contains a copy of + * srcIndexName (destination will be overriten if it already exist). + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer that contains the task ID + */ +AlgoliaSearch.prototype.moveIndex = function(srcIndexName, dstIndexName, callback) { + var postObj = { + operation: 'move', destination: dstIndexName + }; + return this._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(srcIndexName) + '/operation', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/** + * Copy an existing index. + * @param srcIndexName the name of index to copy. + * @param dstIndexName the new index name that will contains a copy + * of srcIndexName (destination will be overriten if it already exist). + * @param scope an array of scopes to copy: ['settings', 'synonyms', 'rules'] + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer that contains the task ID + */ +AlgoliaSearch.prototype.copyIndex = function(srcIndexName, dstIndexName, scopeOrCallback, _callback) { + var postObj = { + operation: 'copy', + destination: dstIndexName + }; + var callback = _callback; + if (typeof scopeOrCallback === 'function') { + // oops, old behaviour of third argument being a function + callback = scopeOrCallback; + } else if (Array.isArray(scopeOrCallback) && scopeOrCallback.length > 0) { + postObj.scope = scopeOrCallback; + } else if (typeof scopeOrCallback !== 'undefined') { + throw new Error('the scope given to `copyIndex` was not an array with settings, synonyms or rules'); + } + return this._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(srcIndexName) + '/operation', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/** + * Return last log entries. + * @param offset Specify the first entry to retrieve (0-based, 0 is the most recent log entry). + * @param length Specify the maximum number of entries to retrieve starting + * at offset. Maximum allowed value: 1000. + * @param type Specify the maximum number of entries to retrieve starting + * at offset. Maximum allowed value: 1000. + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer that contains the task ID + */ +AlgoliaSearch.prototype.getLogs = function(offset, length, callback) { + var clone = require(26); + var params = {}; + if (typeof offset === 'object') { + // getLogs(params) + params = clone(offset); + callback = length; + } else if (arguments.length === 0 || typeof offset === 'function') { + // getLogs([cb]) + callback = offset; + } else if (arguments.length === 1 || typeof length === 'function') { + // getLogs(1, [cb)] + callback = length; + params.offset = offset; + } else { + // getLogs(1, 2, [cb]) + params.offset = offset; + params.length = length; + } + + if (params.offset === undefined) params.offset = 0; + if (params.length === undefined) params.length = 10; + + return this._jsonRequest({ + method: 'GET', + url: '/1/logs?' + this._getSearchParams(params, ''), + hostType: 'read', + callback: callback + }); +}; + +/* + * List all existing indexes (paginated) + * + * @param page The page to retrieve, starting at 0. + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer with index list + */ +AlgoliaSearch.prototype.listIndexes = function(page, callback) { + var params = ''; + + if (page === undefined || typeof page === 'function') { + callback = page; + } else { + params = '?page=' + page; + } + + return this._jsonRequest({ + method: 'GET', + url: '/1/indexes' + params, + hostType: 'read', + callback: callback + }); +}; + +/* + * Get the index object initialized + * + * @param indexName the name of index + * @param callback the result callback with one argument (the Index instance) + */ +AlgoliaSearch.prototype.initIndex = function(indexName) { + return new Index(this, indexName); +}; + +AlgoliaSearch.prototype.initAnalytics = function(opts) { + // the actual require must be inside the function, when put outside then you have a cyclic dependency + // not well resolved that ends up making the main "./index.js" (main module, the agloliasearch function) + // export an object instead of a function + // Other workarounds: + // - rewrite the lib in ES6, cyclic dependencies may be better supported + // - move initAnalytics to a property on the main module (algoliasearch.initAnalytics), + // same as places. + // The current API was made mostly to mimic the one made in PHP + var createAnalyticsClient = require(27); + return createAnalyticsClient(this.applicationID, this.apiKey, opts); +}; + +/* + * @deprecated use client.listApiKeys + */ +AlgoliaSearch.prototype.listUserKeys = deprecate(function(callback) { + return this.listApiKeys(callback); +}, deprecatedMessage('client.listUserKeys()', 'client.listApiKeys()')); + +/* + * List all existing api keys with their associated ACLs + * + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer with api keys list + */ +AlgoliaSearch.prototype.listApiKeys = function(callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/keys', + hostType: 'read', + callback: callback + }); +}; + +/* + * @deprecated see client.getApiKey + */ +AlgoliaSearch.prototype.getUserKeyACL = deprecate(function(key, callback) { + return this.getApiKey(key, callback); +}, deprecatedMessage('client.getUserKeyACL()', 'client.getApiKey()')); + +/* + * Get an API key + * + * @param key + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer with the right API key + */ +AlgoliaSearch.prototype.getApiKey = function(key, callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/keys/' + key, + hostType: 'read', + callback: callback + }); +}; + +/* + * @deprecated see client.deleteApiKey + */ +AlgoliaSearch.prototype.deleteUserKey = deprecate(function(key, callback) { + return this.deleteApiKey(key, callback); +}, deprecatedMessage('client.deleteUserKey()', 'client.deleteApiKey()')); + +/* + * Delete an existing API key + * @param key + * @param callback the result callback called with two arguments + * error: null or Error('message') + * content: the server answer with the date of deletion + */ +AlgoliaSearch.prototype.deleteApiKey = function(key, callback) { + return this._jsonRequest({ + method: 'DELETE', + url: '/1/keys/' + key, + hostType: 'write', + callback: callback + }); +}; + +/** + * Restore a deleted API key + * + * @param {String} key - The key to restore + * @param {Function} callback - The result callback called with two arguments + * error: null or Error('message') + * content: the server answer with the restored API key + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.restoreApiKey('APIKEY') + * @see {@link https://www.algolia.com/doc/rest-api/search/#restore-api-key|Algolia REST API Documentation} + */ +AlgoliaSearch.prototype.restoreApiKey = function(key, callback) { + return this._jsonRequest({ + method: 'POST', + url: '/1/keys/' + key + '/restore', + hostType: 'write', + callback: callback + }); +}; + +/* + @deprecated see client.addApiKey + */ +AlgoliaSearch.prototype.addUserKey = deprecate(function(acls, params, callback) { + return this.addApiKey(acls, params, callback); +}, deprecatedMessage('client.addUserKey()', 'client.addApiKey()')); + +/* + * Add a new global API key + * + * @param {string[]} acls - The list of ACL for this key. Defined by an array of strings that + * can contains the following values: + * - search: allow to search (https and http) + * - addObject: allows to add/update an object in the index (https only) + * - deleteObject : allows to delete an existing object (https only) + * - deleteIndex : allows to delete index content (https only) + * - settings : allows to get index settings (https only) + * - editSettings : allows to change index settings (https only) + * @param {Object} [params] - Optionnal parameters to set for the key + * @param {number} params.validity - Number of seconds after which the key will be automatically removed (0 means no time limit for this key) + * @param {number} params.maxQueriesPerIPPerHour - Number of API calls allowed from an IP address per hour + * @param {number} params.maxHitsPerQuery - Number of hits this API key can retrieve in one call + * @param {string[]} params.indexes - Allowed targeted indexes for this key + * @param {string} params.description - A description for your key + * @param {string[]} params.referers - A list of authorized referers + * @param {Object} params.queryParameters - Force the key to use specific query parameters + * @param {Function} callback - The result callback called with two arguments + * error: null or Error('message') + * content: the server answer with the added API key + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.addApiKey(['search'], { + * validity: 300, + * maxQueriesPerIPPerHour: 2000, + * maxHitsPerQuery: 3, + * indexes: ['fruits'], + * description: 'Eat three fruits', + * referers: ['*.algolia.com'], + * queryParameters: { + * tagFilters: ['public'], + * } + * }) + * @see {@link https://www.algolia.com/doc/rest_api#AddKey|Algolia REST API Documentation} + */ +AlgoliaSearch.prototype.addApiKey = function(acls, params, callback) { + var isArray = require(8); + var usage = 'Usage: client.addApiKey(arrayOfAcls[, params, callback])'; + + if (!isArray(acls)) { + throw new Error(usage); + } + + if (arguments.length === 1 || typeof params === 'function') { + callback = params; + params = null; + } + + var postObj = { + acl: acls + }; + + if (params) { + postObj.validity = params.validity; + postObj.maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour; + postObj.maxHitsPerQuery = params.maxHitsPerQuery; + postObj.indexes = params.indexes; + postObj.description = params.description; + + if (params.queryParameters) { + postObj.queryParameters = this._getSearchParams(params.queryParameters, ''); + } + + postObj.referers = params.referers; + } + + return this._jsonRequest({ + method: 'POST', + url: '/1/keys', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/** + * @deprecated Please use client.addApiKey() + */ +AlgoliaSearch.prototype.addUserKeyWithValidity = deprecate(function(acls, params, callback) { + return this.addApiKey(acls, params, callback); +}, deprecatedMessage('client.addUserKeyWithValidity()', 'client.addApiKey()')); + +/** + * @deprecated Please use client.updateApiKey() + */ +AlgoliaSearch.prototype.updateUserKey = deprecate(function(key, acls, params, callback) { + return this.updateApiKey(key, acls, params, callback); +}, deprecatedMessage('client.updateUserKey()', 'client.updateApiKey()')); + +/** + * Update an existing API key + * @param {string} key - The key to update + * @param {string[]} acls - The list of ACL for this key. Defined by an array of strings that + * can contains the following values: + * - search: allow to search (https and http) + * - addObject: allows to add/update an object in the index (https only) + * - deleteObject : allows to delete an existing object (https only) + * - deleteIndex : allows to delete index content (https only) + * - settings : allows to get index settings (https only) + * - editSettings : allows to change index settings (https only) + * @param {Object} [params] - Optionnal parameters to set for the key + * @param {number} params.validity - Number of seconds after which the key will be automatically removed (0 means no time limit for this key) + * @param {number} params.maxQueriesPerIPPerHour - Number of API calls allowed from an IP address per hour + * @param {number} params.maxHitsPerQuery - Number of hits this API key can retrieve in one call + * @param {string[]} params.indexes - Allowed targeted indexes for this key + * @param {string} params.description - A description for your key + * @param {string[]} params.referers - A list of authorized referers + * @param {Object} params.queryParameters - Force the key to use specific query parameters + * @param {Function} callback - The result callback called with two arguments + * error: null or Error('message') + * content: the server answer with the modified API key + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.updateApiKey('APIKEY', ['search'], { + * validity: 300, + * maxQueriesPerIPPerHour: 2000, + * maxHitsPerQuery: 3, + * indexes: ['fruits'], + * description: 'Eat three fruits', + * referers: ['*.algolia.com'], + * queryParameters: { + * tagFilters: ['public'], + * } + * }) + * @see {@link https://www.algolia.com/doc/rest_api#UpdateIndexKey|Algolia REST API Documentation} + */ +AlgoliaSearch.prototype.updateApiKey = function(key, acls, params, callback) { + var isArray = require(8); + var usage = 'Usage: client.updateApiKey(key, arrayOfAcls[, params, callback])'; + + if (!isArray(acls)) { + throw new Error(usage); + } + + if (arguments.length === 2 || typeof params === 'function') { + callback = params; + params = null; + } + + var putObj = { + acl: acls + }; + + if (params) { + putObj.validity = params.validity; + putObj.maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour; + putObj.maxHitsPerQuery = params.maxHitsPerQuery; + putObj.indexes = params.indexes; + putObj.description = params.description; + + if (params.queryParameters) { + putObj.queryParameters = this._getSearchParams(params.queryParameters, ''); + } + + putObj.referers = params.referers; + } + + return this._jsonRequest({ + method: 'PUT', + url: '/1/keys/' + key, + body: putObj, + hostType: 'write', + callback: callback + }); +}; + +/** + * Initialize a new batch of search queries + * @deprecated use client.search() + */ +AlgoliaSearch.prototype.startQueriesBatch = deprecate(function startQueriesBatchDeprecated() { + this._batch = []; +}, deprecatedMessage('client.startQueriesBatch()', 'client.search()')); + +/** + * Add a search query in the batch + * @deprecated use client.search() + */ +AlgoliaSearch.prototype.addQueryInBatch = deprecate(function addQueryInBatchDeprecated(indexName, query, args) { + this._batch.push({ + indexName: indexName, + query: query, + params: args + }); +}, deprecatedMessage('client.addQueryInBatch()', 'client.search()')); + +/** + * Launch the batch of queries using XMLHttpRequest. + * @deprecated use client.search() + */ +AlgoliaSearch.prototype.sendQueriesBatch = deprecate(function sendQueriesBatchDeprecated(callback) { + return this.search(this._batch, callback); +}, deprecatedMessage('client.sendQueriesBatch()', 'client.search()')); + +/** + * Perform write operations across multiple indexes. + * + * To reduce the amount of time spent on network round trips, + * you can create, update, or delete several objects in one call, + * using the batch endpoint (all operations are done in the given order). + * + * Available actions: + * - addObject + * - updateObject + * - partialUpdateObject + * - partialUpdateObjectNoCreate + * - deleteObject + * + * https://www.algolia.com/doc/rest_api#Indexes + * @param {Object[]} operations An array of operations to perform + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.batch([{ + * action: 'addObject', + * indexName: 'clients', + * body: { + * name: 'Bill' + * } + * }, { + * action: 'udpateObject', + * indexName: 'fruits', + * body: { + * objectID: '29138', + * name: 'banana' + * } + * }], cb) + */ +AlgoliaSearch.prototype.batch = function(operations, callback) { + var isArray = require(8); + var usage = 'Usage: client.batch(operations[, callback])'; + + if (!isArray(operations)) { + throw new Error(usage); + } + + return this._jsonRequest({ + method: 'POST', + url: '/1/indexes/*/batch', + body: { + requests: operations + }, + hostType: 'write', + callback: callback + }); +}; + +/** + * Assign or Move a userID to a cluster + * + * @param {string} data.userID The userID to assign to a new cluster + * @param {string} data.cluster The cluster to assign the user to + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.assignUserID({ cluster: 'c1-test', userID: 'some-user' }); + */ +AlgoliaSearch.prototype.assignUserID = function(data, callback) { + if (!data.userID || !data.cluster) { + throw new errors.AlgoliaSearchError('You have to provide both a userID and cluster', data); + } + return this._jsonRequest({ + method: 'POST', + url: '/1/clusters/mapping', + hostType: 'write', + body: {cluster: data.cluster}, + callback: callback, + headers: { + 'x-algolia-user-id': data.userID + } + }); +}; + +/** + * Assign a array of userIDs to a cluster. + * + * @param {Array} data.userIDs The array of userIDs to assign to a new cluster + * @param {string} data.cluster The cluster to assign the user to + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.assignUserIDs({ cluster: 'c1-test', userIDs: ['some-user-1', 'some-user-2'] }); + */ +AlgoliaSearch.prototype.assignUserIDs = function(data, callback) { + if (!data.userIDs || !data.cluster) { + throw new errors.AlgoliaSearchError('You have to provide both an array of userIDs and cluster', data); + } + return this._jsonRequest({ + method: 'POST', + url: '/1/clusters/mapping/batch', + hostType: 'write', + body: { + cluster: data.cluster, + users: data.userIDs + }, + callback: callback + }); +}; + +/** + * Get the top userIDs + * + * (the callback is the second argument) + * + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.getTopUserID(); + */ +AlgoliaSearch.prototype.getTopUserID = function(callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/clusters/mapping/top', + hostType: 'read', + callback: callback + }); +}; + +/** + * Get userID + * + * @param {string} data.userID The userID to get info about + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.getUserID({ userID: 'some-user' }); + */ +AlgoliaSearch.prototype.getUserID = function(data, callback) { + if (!data.userID) { + throw new errors.AlgoliaSearchError('You have to provide a userID', {debugData: data}); + } + return this._jsonRequest({ + method: 'GET', + url: '/1/clusters/mapping/' + data.userID, + hostType: 'read', + callback: callback + }); +}; + +/** + * List all the clusters + * + * (the callback is the second argument) + * + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.listClusters(); + */ +AlgoliaSearch.prototype.listClusters = function(callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/clusters', + hostType: 'read', + callback: callback + }); +}; + +/** + * List the userIDs + * + * (the callback is the second argument) + * + * @param {string} data.hitsPerPage How many hits on every page + * @param {string} data.page The page to retrieve + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.listClusters(); + * client.listClusters({ page: 3, hitsPerPage: 30}); + */ +AlgoliaSearch.prototype.listUserIDs = function(data, callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/clusters/mapping', + body: data, + hostType: 'read', + callback: callback + }); +}; + +/** + * Remove an userID + * + * @param {string} data.userID The userID to assign to a new cluster + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.removeUserID({ userID: 'some-user' }); + */ +AlgoliaSearch.prototype.removeUserID = function(data, callback) { + if (!data.userID) { + throw new errors.AlgoliaSearchError('You have to provide a userID', {debugData: data}); + } + return this._jsonRequest({ + method: 'DELETE', + url: '/1/clusters/mapping', + hostType: 'write', + callback: callback, + headers: { + 'x-algolia-user-id': data.userID + } + }); +}; + +/** + * Search for userIDs + * + * @param {string} data.cluster The cluster to target + * @param {string} data.query The query to execute + * @param {string} data.hitsPerPage How many hits on every page + * @param {string} data.page The page to retrieve + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.searchUserIDs({ cluster: 'c1-test', query: 'some-user' }); + * client.searchUserIDs({ + * cluster: "c1-test", + * query: "some-user", + * page: 3, + * hitsPerPage: 2 + * }); + */ +AlgoliaSearch.prototype.searchUserIDs = function(data, callback) { + return this._jsonRequest({ + method: 'POST', + url: '/1/clusters/mapping/search', + body: data, + hostType: 'read', + callback: callback + }); +}; + +/** + * Set strategy for personalization + * + * @param {Object} data + * @param {Object} data.eventsScoring Associate a score to an event + * @param {Object} data.eventsScoring. The name of the event + * @param {Number} data.eventsScoring..score The score to associate to + * @param {String} data.eventsScoring..type Either "click", "conversion" or "view" + * @param {Object} data.facetsScoring Associate a score to a facet + * @param {Object} data.facetsScoring. The name of the facet + * @param {Number} data.facetsScoring..score The score to associate to + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.setPersonalizationStrategy({ + * eventsScoring: { + * "Add to cart": { score: 50, type: "conversion" }, + * Purchase: { score: 100, type: "conversion" } + * }, + * facetsScoring: { + * brand: { score: 100 }, + * categories: { score: 10 } + * } + * }); + */ +AlgoliaSearch.prototype.setPersonalizationStrategy = function(data, callback) { + return this._jsonRequest({ + method: 'POST', + url: '/1/recommendation/personalization/strategy', + body: data, + hostType: 'write', + callback: callback + }); +}; + +/** + * Get strategy for personalization + * + * @return {Promise|undefined} Returns a promise if no callback given + * @example + * client.getPersonalizationStrategy(); + */ + +AlgoliaSearch.prototype.getPersonalizationStrategy = function(callback) { + return this._jsonRequest({ + method: 'GET', + url: '/1/recommendation/personalization/strategy', + hostType: 'read', + callback: callback + }); +}; + +// environment specific methods +AlgoliaSearch.prototype.destroy = notImplemented; +AlgoliaSearch.prototype.enableRateLimitForward = notImplemented; +AlgoliaSearch.prototype.disableRateLimitForward = notImplemented; +AlgoliaSearch.prototype.useSecuredAPIKey = notImplemented; +AlgoliaSearch.prototype.disableSecuredAPIKey = notImplemented; +AlgoliaSearch.prototype.generateSecuredApiKey = notImplemented; +AlgoliaSearch.prototype.getSecuredApiKeyRemainingValidity = notImplemented; + +function notImplemented() { + var message = 'Not implemented in this environment.\n' + + 'If you feel this is a mistake, write to support@algolia.com'; + + throw new errors.AlgoliaSearchError(message); +} + +},{"17":17,"18":18,"26":26,"27":27,"28":28,"29":29,"30":30,"7":7,"8":8}],17:[function(require,module,exports){ +(function (process){ +module.exports = AlgoliaSearchCore; + +var errors = require(30); +var exitPromise = require(31); +var IndexCore = require(20); +var store = require(36); + +// We will always put the API KEY in the JSON body in case of too long API KEY, +// to avoid query string being too long and failing in various conditions (our server limit, browser limit, +// proxies limit) +var MAX_API_KEY_LENGTH = 500; +var RESET_APP_DATA_TIMER = + process.env.RESET_APP_DATA_TIMER && parseInt(process.env.RESET_APP_DATA_TIMER, 10) || + 60 * 2 * 1000; // after 2 minutes reset to first host + +/* + * Algolia Search library initialization + * https://www.algolia.com/ + * + * @param {string} applicationID - Your applicationID, found in your dashboard + * @param {string} apiKey - Your API key, found in your dashboard + * @param {Object} [opts] + * @param {number} [opts.timeout=2000] - The request timeout set in milliseconds, + * another request will be issued after this timeout + * @param {string} [opts.protocol='https:'] - The protocol used to query Algolia Search API. + * Set to 'http:' to force using http. + * @param {Object|Array} [opts.hosts={ + * read: [this.applicationID + '-dsn.algolia.net'].concat([ + * this.applicationID + '-1.algolianet.com', + * this.applicationID + '-2.algolianet.com', + * this.applicationID + '-3.algolianet.com'] + * ]), + * write: [this.applicationID + '.algolia.net'].concat([ + * this.applicationID + '-1.algolianet.com', + * this.applicationID + '-2.algolianet.com', + * this.applicationID + '-3.algolianet.com'] + * ]) - The hosts to use for Algolia Search API. + * If you provide them, you will less benefit from our HA implementation + */ +function AlgoliaSearchCore(applicationID, apiKey, opts) { + var debug = require(1)('algoliasearch'); + + var clone = require(26); + var isArray = require(8); + var map = require(32); + + var usage = 'Usage: algoliasearch(applicationID, apiKey, opts)'; + + if (opts._allowEmptyCredentials !== true && !applicationID) { + throw new errors.AlgoliaSearchError('Please provide an application ID. ' + usage); + } + + if (opts._allowEmptyCredentials !== true && !apiKey) { + throw new errors.AlgoliaSearchError('Please provide an API key. ' + usage); + } + + this.applicationID = applicationID; + this.apiKey = apiKey; + + this.hosts = { + read: [], + write: [] + }; + + opts = opts || {}; + + this._timeouts = opts.timeouts || { + connect: 1 * 1000, // 500ms connect is GPRS latency + read: 2 * 1000, + write: 30 * 1000 + }; + + // backward compat, if opts.timeout is passed, we use it to configure all timeouts like before + if (opts.timeout) { + this._timeouts.connect = this._timeouts.read = this._timeouts.write = opts.timeout; + } + + var protocol = opts.protocol || 'https:'; + // while we advocate for colon-at-the-end values: 'http:' for `opts.protocol` + // we also accept `http` and `https`. It's a common error. + if (!/:$/.test(protocol)) { + protocol = protocol + ':'; + } + + if (protocol !== 'http:' && protocol !== 'https:') { + throw new errors.AlgoliaSearchError('protocol must be `http:` or `https:` (was `' + opts.protocol + '`)'); + } + + this._checkAppIdData(); + + if (!opts.hosts) { + var defaultHosts = map(this._shuffleResult, function(hostNumber) { + return applicationID + '-' + hostNumber + '.algolianet.com'; + }); + + // no hosts given, compute defaults + var mainSuffix = (opts.dsn === false ? '' : '-dsn') + '.algolia.net'; + this.hosts.read = [this.applicationID + mainSuffix].concat(defaultHosts); + this.hosts.write = [this.applicationID + '.algolia.net'].concat(defaultHosts); + } else if (isArray(opts.hosts)) { + // when passing custom hosts, we need to have a different host index if the number + // of write/read hosts are different. + this.hosts.read = clone(opts.hosts); + this.hosts.write = clone(opts.hosts); + } else { + this.hosts.read = clone(opts.hosts.read); + this.hosts.write = clone(opts.hosts.write); + } + + // add protocol and lowercase hosts + this.hosts.read = map(this.hosts.read, prepareHost(protocol)); + this.hosts.write = map(this.hosts.write, prepareHost(protocol)); + + this.extraHeaders = {}; + + // In some situations you might want to warm the cache + this.cache = opts._cache || {}; + + this._ua = opts._ua; + this._useCache = opts._useCache === undefined || opts._cache ? true : opts._useCache; + this._useRequestCache = this._useCache && opts._useRequestCache; + this._useFallback = opts.useFallback === undefined ? true : opts.useFallback; + + this._setTimeout = opts._setTimeout; + + debug('init done, %j', this); +} + +/* + * Get the index object initialized + * + * @param indexName the name of index + * @param callback the result callback with one argument (the Index instance) + */ +AlgoliaSearchCore.prototype.initIndex = function(indexName) { + return new IndexCore(this, indexName); +}; + +/** +* Add an extra field to the HTTP request +* +* @param name the header field name +* @param value the header field value +*/ +AlgoliaSearchCore.prototype.setExtraHeader = function(name, value) { + this.extraHeaders[name.toLowerCase()] = value; +}; + +/** +* Get the value of an extra HTTP header +* +* @param name the header field name +*/ +AlgoliaSearchCore.prototype.getExtraHeader = function(name) { + return this.extraHeaders[name.toLowerCase()]; +}; + +/** +* Remove an extra field from the HTTP request +* +* @param name the header field name +*/ +AlgoliaSearchCore.prototype.unsetExtraHeader = function(name) { + delete this.extraHeaders[name.toLowerCase()]; +}; + +/** +* Augment sent x-algolia-agent with more data, each agent part +* is automatically separated from the others by a semicolon; +* +* @param algoliaAgent the agent to add +*/ +AlgoliaSearchCore.prototype.addAlgoliaAgent = function(algoliaAgent) { + var algoliaAgentWithDelimiter = '; ' + algoliaAgent; + + if (this._ua.indexOf(algoliaAgentWithDelimiter) === -1) { + this._ua += algoliaAgentWithDelimiter; + } +}; + +/* + * Wrapper that try all hosts to maximize the quality of service + */ +AlgoliaSearchCore.prototype._jsonRequest = function(initialOpts) { + this._checkAppIdData(); + + var requestDebug = require(1)('algoliasearch:' + initialOpts.url); + + + var body; + var cacheID; + var additionalUA = initialOpts.additionalUA || ''; + var cache = initialOpts.cache; + var client = this; + var tries = 0; + var usingFallback = false; + var hasFallback = client._useFallback && client._request.fallback && initialOpts.fallback; + var headers; + + if ( + this.apiKey.length > MAX_API_KEY_LENGTH && + initialOpts.body !== undefined && + (initialOpts.body.params !== undefined || // index.search() + initialOpts.body.requests !== undefined) // client.search() + ) { + initialOpts.body.apiKey = this.apiKey; + headers = this._computeRequestHeaders({ + additionalUA: additionalUA, + withApiKey: false, + headers: initialOpts.headers + }); + } else { + headers = this._computeRequestHeaders({ + additionalUA: additionalUA, + headers: initialOpts.headers + }); + } + + if (initialOpts.body !== undefined) { + body = safeJSONStringify(initialOpts.body); + } + + requestDebug('request start'); + var debugData = []; + + + function doRequest(requester, reqOpts) { + client._checkAppIdData(); + + var startTime = new Date(); + + if (client._useCache && !client._useRequestCache) { + cacheID = initialOpts.url; + } + + // as we sometime use POST requests to pass parameters (like query='aa'), + // the cacheID must also include the body to be different between calls + if (client._useCache && !client._useRequestCache && body) { + cacheID += '_body_' + reqOpts.body; + } + + // handle cache existence + if (isCacheValidWithCurrentID(!client._useRequestCache, cache, cacheID)) { + requestDebug('serving response from cache'); + + var responseText = cache[cacheID]; + + // Cache response must match the type of the original one + return client._promise.resolve({ + body: JSON.parse(responseText), + responseText: responseText + }); + } + + // if we reached max tries + if (tries >= client.hosts[initialOpts.hostType].length) { + if (!hasFallback || usingFallback) { + requestDebug('could not get any response'); + // then stop + return client._promise.reject(new errors.AlgoliaSearchError( + 'Cannot connect to the AlgoliaSearch API.' + + ' Send an email to support@algolia.com to report and resolve the issue.' + + ' Application id was: ' + client.applicationID, {debugData: debugData} + )); + } + + requestDebug('switching to fallback'); + + // let's try the fallback starting from here + tries = 0; + + // method, url and body are fallback dependent + reqOpts.method = initialOpts.fallback.method; + reqOpts.url = initialOpts.fallback.url; + reqOpts.jsonBody = initialOpts.fallback.body; + if (reqOpts.jsonBody) { + reqOpts.body = safeJSONStringify(reqOpts.jsonBody); + } + // re-compute headers, they could be omitting the API KEY + headers = client._computeRequestHeaders({ + additionalUA: additionalUA, + headers: initialOpts.headers + }); + + reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType); + client._setHostIndexByType(0, initialOpts.hostType); + usingFallback = true; // the current request is now using fallback + return doRequest(client._request.fallback, reqOpts); + } + + var currentHost = client._getHostByType(initialOpts.hostType); + + var url = currentHost + reqOpts.url; + var options = { + body: reqOpts.body, + jsonBody: reqOpts.jsonBody, + method: reqOpts.method, + headers: headers, + timeouts: reqOpts.timeouts, + debug: requestDebug, + forceAuthHeaders: reqOpts.forceAuthHeaders + }; + + requestDebug('method: %s, url: %s, headers: %j, timeouts: %d', + options.method, url, options.headers, options.timeouts); + + if (requester === client._request.fallback) { + requestDebug('using fallback'); + } + + // `requester` is any of this._request or this._request.fallback + // thus it needs to be called using the client as context + return requester.call(client, url, options).then(success, tryFallback); + + function success(httpResponse) { + // compute the status of the response, + // + // When in browser mode, using XDR or JSONP, we have no statusCode available + // So we rely on our API response `status` property. + // But `waitTask` can set a `status` property which is not the statusCode (it's the task status) + // So we check if there's a `message` along `status` and it means it's an error + // + // That's the only case where we have a response.status that's not the http statusCode + var status = httpResponse && httpResponse.body && httpResponse.body.message && httpResponse.body.status || + + // this is important to check the request statusCode AFTER the body eventual + // statusCode because some implementations (jQuery XDomainRequest transport) may + // send statusCode 200 while we had an error + httpResponse.statusCode || + + // When in browser mode, using XDR or JSONP + // we default to success when no error (no response.status && response.message) + // If there was a JSON.parse() error then body is null and it fails + httpResponse && httpResponse.body && 200; + + requestDebug('received response: statusCode: %s, computed statusCode: %d, headers: %j', + httpResponse.statusCode, status, httpResponse.headers); + + var httpResponseOk = Math.floor(status / 100) === 2; + + var endTime = new Date(); + debugData.push({ + currentHost: currentHost, + headers: removeCredentials(headers), + content: body || null, + contentLength: body !== undefined ? body.length : null, + method: reqOpts.method, + timeouts: reqOpts.timeouts, + url: reqOpts.url, + startTime: startTime, + endTime: endTime, + duration: endTime - startTime, + statusCode: status + }); + + if (httpResponseOk) { + if (client._useCache && !client._useRequestCache && cache) { + cache[cacheID] = httpResponse.responseText; + } + + return { + responseText: httpResponse.responseText, + body: httpResponse.body + }; + } + + var shouldRetry = Math.floor(status / 100) !== 4; + + if (shouldRetry) { + tries += 1; + return retryRequest(); + } + + requestDebug('unrecoverable error'); + + // no success and no retry => fail + var unrecoverableError = new errors.AlgoliaSearchError( + httpResponse.body && httpResponse.body.message, {debugData: debugData, statusCode: status} + ); + + return client._promise.reject(unrecoverableError); + } + + function tryFallback(err) { + // error cases: + // While not in fallback mode: + // - CORS not supported + // - network error + // While in fallback mode: + // - timeout + // - network error + // - badly formatted JSONP (script loaded, did not call our callback) + // In both cases: + // - uncaught exception occurs (TypeError) + requestDebug('error: %s, stack: %s', err.message, err.stack); + + var endTime = new Date(); + debugData.push({ + currentHost: currentHost, + headers: removeCredentials(headers), + content: body || null, + contentLength: body !== undefined ? body.length : null, + method: reqOpts.method, + timeouts: reqOpts.timeouts, + url: reqOpts.url, + startTime: startTime, + endTime: endTime, + duration: endTime - startTime + }); + + if (!(err instanceof errors.AlgoliaSearchError)) { + err = new errors.Unknown(err && err.message, err); + } + + tries += 1; + + // stop the request implementation when: + if ( + // we did not generate this error, + // it comes from a throw in some other piece of code + err instanceof errors.Unknown || + + // server sent unparsable JSON + err instanceof errors.UnparsableJSON || + + // max tries and already using fallback or no fallback + tries >= client.hosts[initialOpts.hostType].length && + (usingFallback || !hasFallback)) { + // stop request implementation for this command + err.debugData = debugData; + return client._promise.reject(err); + } + + // When a timeout occurred, retry by raising timeout + if (err instanceof errors.RequestTimeout) { + return retryRequestWithHigherTimeout(); + } + + return retryRequest(); + } + + function retryRequest() { + requestDebug('retrying request'); + client._incrementHostIndex(initialOpts.hostType); + return doRequest(requester, reqOpts); + } + + function retryRequestWithHigherTimeout() { + requestDebug('retrying request with higher timeout'); + client._incrementHostIndex(initialOpts.hostType); + client._incrementTimeoutMultipler(); + reqOpts.timeouts = client._getTimeoutsForRequest(initialOpts.hostType); + return doRequest(requester, reqOpts); + } + } + + function isCacheValidWithCurrentID( + useRequestCache, + currentCache, + currentCacheID + ) { + return ( + client._useCache && + useRequestCache && + currentCache && + currentCache[currentCacheID] !== undefined + ); + } + + + function interopCallbackReturn(request, callback) { + if (isCacheValidWithCurrentID(client._useRequestCache, cache, cacheID)) { + request.catch(function() { + // Release the cache on error + delete cache[cacheID]; + }); + } + + if (typeof initialOpts.callback === 'function') { + // either we have a callback + request.then(function okCb(content) { + exitPromise(function() { + initialOpts.callback(null, callback(content)); + }, client._setTimeout || setTimeout); + }, function nookCb(err) { + exitPromise(function() { + initialOpts.callback(err); + }, client._setTimeout || setTimeout); + }); + } else { + // either we are using promises + return request.then(callback); + } + } + + if (client._useCache && client._useRequestCache) { + cacheID = initialOpts.url; + } + + // as we sometime use POST requests to pass parameters (like query='aa'), + // the cacheID must also include the body to be different between calls + if (client._useCache && client._useRequestCache && body) { + cacheID += '_body_' + body; + } + + if (isCacheValidWithCurrentID(client._useRequestCache, cache, cacheID)) { + requestDebug('serving request from cache'); + + var maybePromiseForCache = cache[cacheID]; + + // In case the cache is warmup with value that is not a promise + var promiseForCache = typeof maybePromiseForCache.then !== 'function' + ? client._promise.resolve({responseText: maybePromiseForCache}) + : maybePromiseForCache; + + return interopCallbackReturn(promiseForCache, function(content) { + // In case of the cache request, return the original value + return JSON.parse(content.responseText); + }); + } + + var request = doRequest( + client._request, { + url: initialOpts.url, + method: initialOpts.method, + body: body, + jsonBody: initialOpts.body, + timeouts: client._getTimeoutsForRequest(initialOpts.hostType), + forceAuthHeaders: initialOpts.forceAuthHeaders + } + ); + + if (client._useCache && client._useRequestCache && cache) { + cache[cacheID] = request; + } + + return interopCallbackReturn(request, function(content) { + // In case of the first request, return the JSON value + return content.body; + }); +}; + +/* +* Transform search param object in query string +* @param {object} args arguments to add to the current query string +* @param {string} params current query string +* @return {string} the final query string +*/ +AlgoliaSearchCore.prototype._getSearchParams = function(args, params) { + if (args === undefined || args === null) { + return params; + } + for (var key in args) { + if (key !== null && args[key] !== undefined && args.hasOwnProperty(key)) { + params += params === '' ? '' : '&'; + params += key + '=' + encodeURIComponent(Object.prototype.toString.call(args[key]) === '[object Array]' ? safeJSONStringify(args[key]) : args[key]); + } + } + return params; +}; + +/** + * Compute the headers for a request + * + * @param [string] options.additionalUA semi-colon separated string with other user agents to add + * @param [boolean=true] options.withApiKey Send the api key as a header + * @param [Object] options.headers Extra headers to send + */ +AlgoliaSearchCore.prototype._computeRequestHeaders = function(options) { + var forEach = require(5); + + var ua = options.additionalUA ? + this._ua + '; ' + options.additionalUA : + this._ua; + + var requestHeaders = { + 'x-algolia-agent': ua, + 'x-algolia-application-id': this.applicationID + }; + + // browser will inline headers in the url, node.js will use http headers + // but in some situations, the API KEY will be too long (big secured API keys) + // so if the request is a POST and the KEY is very long, we will be asked to not put + // it into headers but in the JSON body + if (options.withApiKey !== false) { + requestHeaders['x-algolia-api-key'] = this.apiKey; + } + + if (this.userToken) { + requestHeaders['x-algolia-usertoken'] = this.userToken; + } + + if (this.securityTags) { + requestHeaders['x-algolia-tagfilters'] = this.securityTags; + } + + forEach(this.extraHeaders, function addToRequestHeaders(value, key) { + requestHeaders[key] = value; + }); + + if (options.headers) { + forEach(options.headers, function addToRequestHeaders(value, key) { + requestHeaders[key] = value; + }); + } + + return requestHeaders; +}; + +/** + * Search through multiple indices at the same time + * @param {Object[]} queries An array of queries you want to run. + * @param {string} queries[].indexName The index name you want to target + * @param {string} [queries[].query] The query to issue on this index. Can also be passed into `params` + * @param {Object} queries[].params Any search param like hitsPerPage, .. + * @param {Function} callback Callback to be called + * @return {Promise|undefined} Returns a promise if no callback given + */ +AlgoliaSearchCore.prototype.search = function(queries, opts, callback) { + var isArray = require(8); + var map = require(32); + + var usage = 'Usage: client.search(arrayOfQueries[, callback])'; + + if (!isArray(queries)) { + throw new Error(usage); + } + + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + var client = this; + + var postObj = { + requests: map(queries, function prepareRequest(query) { + var params = ''; + + // allow query.query + // so we are mimicing the index.search(query, params) method + // {indexName:, query:, params:} + if (query.query !== undefined) { + params += 'query=' + encodeURIComponent(query.query); + } + + return { + indexName: query.indexName, + params: client._getSearchParams(query.params, params) + }; + }) + }; + + var JSONPParams = map(postObj.requests, function prepareJSONPParams(request, requestId) { + return requestId + '=' + + encodeURIComponent( + '/1/indexes/' + encodeURIComponent(request.indexName) + '?' + + request.params + ); + }).join('&'); + + var url = '/1/indexes/*/queries'; + + if (opts.strategy !== undefined) { + postObj.strategy = opts.strategy; + } + + return this._jsonRequest({ + cache: this.cache, + method: 'POST', + url: url, + body: postObj, + hostType: 'read', + fallback: { + method: 'GET', + url: '/1/indexes/*', + body: { + params: JSONPParams + } + }, + callback: callback + }); +}; + +/** +* Search for facet values +* https://www.algolia.com/doc/rest-api/search#search-for-facet-values +* This is the top-level API for SFFV. +* +* @param {object[]} queries An array of queries to run. +* @param {string} queries[].indexName Index name, name of the index to search. +* @param {object} queries[].params Query parameters. +* @param {string} queries[].params.facetName Facet name, name of the attribute to search for values in. +* Must be declared as a facet +* @param {string} queries[].params.facetQuery Query for the facet search +* @param {string} [queries[].params.*] Any search parameter of Algolia, +* see https://www.algolia.com/doc/api-client/javascript/search#search-parameters +* Pagination is not supported. The page and hitsPerPage parameters will be ignored. +*/ +AlgoliaSearchCore.prototype.searchForFacetValues = function(queries) { + var isArray = require(8); + var map = require(32); + + var usage = 'Usage: client.searchForFacetValues([{indexName, params: {facetName, facetQuery, ...params}}, ...queries])'; // eslint-disable-line max-len + + if (!isArray(queries)) { + throw new Error(usage); + } + + var client = this; + + return client._promise.all(map(queries, function performQuery(query) { + if ( + !query || + query.indexName === undefined || + query.params.facetName === undefined || + query.params.facetQuery === undefined + ) { + throw new Error(usage); + } + + var clone = require(26); + var omit = require(34); + + var indexName = query.indexName; + var params = query.params; + + var facetName = params.facetName; + var filteredParams = omit(clone(params), function(keyName) { + return keyName === 'facetName'; + }); + var searchParameters = client._getSearchParams(filteredParams, ''); + + return client._jsonRequest({ + cache: client.cache, + method: 'POST', + url: + '/1/indexes/' + + encodeURIComponent(indexName) + + '/facets/' + + encodeURIComponent(facetName) + + '/query', + hostType: 'read', + body: {params: searchParameters} + }); + })); +}; + +/** + * Set the extra security tagFilters header + * @param {string|array} tags The list of tags defining the current security filters + */ +AlgoliaSearchCore.prototype.setSecurityTags = function(tags) { + if (Object.prototype.toString.call(tags) === '[object Array]') { + var strTags = []; + for (var i = 0; i < tags.length; ++i) { + if (Object.prototype.toString.call(tags[i]) === '[object Array]') { + var oredTags = []; + for (var j = 0; j < tags[i].length; ++j) { + oredTags.push(tags[i][j]); + } + strTags.push('(' + oredTags.join(',') + ')'); + } else { + strTags.push(tags[i]); + } + } + tags = strTags.join(','); + } + + this.securityTags = tags; +}; + +/** + * Set the extra user token header + * @param {string} userToken The token identifying a uniq user (used to apply rate limits) + */ +AlgoliaSearchCore.prototype.setUserToken = function(userToken) { + this.userToken = userToken; +}; + +/** + * Clear all queries in client's cache + * @return undefined + */ +AlgoliaSearchCore.prototype.clearCache = function() { + this.cache = {}; +}; + +/** +* Set the number of milliseconds a request can take before automatically being terminated. +* @deprecated +* @param {Number} milliseconds +*/ +AlgoliaSearchCore.prototype.setRequestTimeout = function(milliseconds) { + if (milliseconds) { + this._timeouts.connect = this._timeouts.read = this._timeouts.write = milliseconds; + } +}; + +/** +* Set the three different (connect, read, write) timeouts to be used when requesting +* @param {Object} timeouts +*/ +AlgoliaSearchCore.prototype.setTimeouts = function(timeouts) { + this._timeouts = timeouts; +}; + +/** +* Get the three different (connect, read, write) timeouts to be used when requesting +* @param {Object} timeouts +*/ +AlgoliaSearchCore.prototype.getTimeouts = function() { + return this._timeouts; +}; + +AlgoliaSearchCore.prototype._getAppIdData = function() { + var data = store.get(this.applicationID); + if (data !== null) this._cacheAppIdData(data); + return data; +}; + +AlgoliaSearchCore.prototype._setAppIdData = function(data) { + data.lastChange = (new Date()).getTime(); + this._cacheAppIdData(data); + return store.set(this.applicationID, data); +}; + +AlgoliaSearchCore.prototype._checkAppIdData = function() { + var data = this._getAppIdData(); + var now = (new Date()).getTime(); + if (data === null || now - data.lastChange > RESET_APP_DATA_TIMER) { + return this._resetInitialAppIdData(data); + } + + return data; +}; + +AlgoliaSearchCore.prototype._resetInitialAppIdData = function(data) { + var newData = data || {}; + newData.hostIndexes = {read: 0, write: 0}; + newData.timeoutMultiplier = 1; + newData.shuffleResult = newData.shuffleResult || shuffle([1, 2, 3]); + return this._setAppIdData(newData); +}; + +AlgoliaSearchCore.prototype._cacheAppIdData = function(data) { + this._hostIndexes = data.hostIndexes; + this._timeoutMultiplier = data.timeoutMultiplier; + this._shuffleResult = data.shuffleResult; +}; + +AlgoliaSearchCore.prototype._partialAppIdDataUpdate = function(newData) { + var foreach = require(5); + var currentData = this._getAppIdData(); + foreach(newData, function(value, key) { + currentData[key] = value; + }); + + return this._setAppIdData(currentData); +}; + +AlgoliaSearchCore.prototype._getHostByType = function(hostType) { + return this.hosts[hostType][this._getHostIndexByType(hostType)]; +}; + +AlgoliaSearchCore.prototype._getTimeoutMultiplier = function() { + return this._timeoutMultiplier; +}; + +AlgoliaSearchCore.prototype._getHostIndexByType = function(hostType) { + return this._hostIndexes[hostType]; +}; + +AlgoliaSearchCore.prototype._setHostIndexByType = function(hostIndex, hostType) { + var clone = require(26); + var newHostIndexes = clone(this._hostIndexes); + newHostIndexes[hostType] = hostIndex; + this._partialAppIdDataUpdate({hostIndexes: newHostIndexes}); + return hostIndex; +}; + +AlgoliaSearchCore.prototype._incrementHostIndex = function(hostType) { + return this._setHostIndexByType( + (this._getHostIndexByType(hostType) + 1) % this.hosts[hostType].length, hostType + ); +}; + +AlgoliaSearchCore.prototype._incrementTimeoutMultipler = function() { + var timeoutMultiplier = Math.max(this._timeoutMultiplier + 1, 4); + return this._partialAppIdDataUpdate({timeoutMultiplier: timeoutMultiplier}); +}; + +AlgoliaSearchCore.prototype._getTimeoutsForRequest = function(hostType) { + return { + connect: this._timeouts.connect * this._timeoutMultiplier, + complete: this._timeouts[hostType] * this._timeoutMultiplier + }; +}; + +function prepareHost(protocol) { + return function prepare(host) { + return protocol + '//' + host.toLowerCase(); + }; +} + +// Prototype.js < 1.7, a widely used library, defines a weird +// Array.prototype.toJSON function that will fail to stringify our content +// appropriately +// refs: +// - https://groups.google.com/forum/#!topic/prototype-core/E-SAVvV_V9Q +// - https://github.com/sstephenson/prototype/commit/038a2985a70593c1a86c230fadbdfe2e4898a48c +// - http://stackoverflow.com/a/3148441/147079 +function safeJSONStringify(obj) { + /* eslint no-extend-native:0 */ + + if (Array.prototype.toJSON === undefined) { + return JSON.stringify(obj); + } + + var toJSON = Array.prototype.toJSON; + delete Array.prototype.toJSON; + var out = JSON.stringify(obj); + Array.prototype.toJSON = toJSON; + + return out; +} + +function shuffle(array) { + var currentIndex = array.length; + var temporaryValue; + var randomIndex; + + // While there remain elements to shuffle... + while (currentIndex !== 0) { + // Pick a remaining element... + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + // And swap it with the current element. + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +} + +function removeCredentials(headers) { + var newHeaders = {}; + + for (var headerName in headers) { + if (Object.prototype.hasOwnProperty.call(headers, headerName)) { + var value; + + if (headerName === 'x-algolia-api-key' || headerName === 'x-algolia-application-id') { + value = '**hidden for security purposes**'; + } else { + value = headers[headerName]; + } + + newHeaders[headerName] = value; + } + } + + return newHeaders; +} + +}).call(this,require(12)) +},{"1":1,"12":12,"20":20,"26":26,"30":30,"31":31,"32":32,"34":34,"36":36,"5":5,"8":8}],18:[function(require,module,exports){ +var inherits = require(7); +var IndexCore = require(20); +var deprecate = require(28); +var deprecatedMessage = require(29); +var exitPromise = require(31); +var errors = require(30); + +var deprecateForwardToSlaves = deprecate( + function() {}, + deprecatedMessage('forwardToSlaves', 'forwardToReplicas') +); + +module.exports = Index; + +function Index() { + IndexCore.apply(this, arguments); +} + +inherits(Index, IndexCore); + +/* +* Add an object in this index +* +* @param content contains the javascript object to add inside the index +* @param objectID (optional) an objectID you want to attribute to this object +* (if the attribute already exist the old object will be overwrite) +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that contains 3 elements: createAt, taskId and objectID +*/ +Index.prototype.addObject = function(content, objectID, callback) { + var indexObj = this; + + if (arguments.length === 1 || typeof objectID === 'function') { + callback = objectID; + objectID = undefined; + } + + return this.as._jsonRequest({ + method: objectID !== undefined ? + 'PUT' : // update or create + 'POST', // create (API generates an objectID) + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + // create + (objectID !== undefined ? '/' + encodeURIComponent(objectID) : ''), // update or create + body: content, + hostType: 'write', + callback: callback + }); +}; + +/* +* Add several objects +* +* @param objects contains an array of objects to add +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that updateAt and taskID +*/ +Index.prototype.addObjects = function(objects, callback) { + var isArray = require(8); + var usage = 'Usage: index.addObjects(arrayOfObjects[, callback])'; + + if (!isArray(objects)) { + throw new Error(usage); + } + + var indexObj = this; + var postObj = { + requests: [] + }; + for (var i = 0; i < objects.length; ++i) { + var request = { + action: 'addObject', + body: objects[i] + }; + postObj.requests.push(request); + } + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/* +* Update partially an object (only update attributes passed in argument) +* +* @param partialObject contains the javascript attributes to override, the +* object must contains an objectID attribute +* @param createIfNotExists (optional) if false, avoid an automatic creation of the object +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that contains 3 elements: createAt, taskId and objectID +*/ +Index.prototype.partialUpdateObject = function(partialObject, createIfNotExists, callback) { + if (arguments.length === 1 || typeof createIfNotExists === 'function') { + callback = createIfNotExists; + createIfNotExists = undefined; + } + + var indexObj = this; + var url = '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(partialObject.objectID) + '/partial'; + if (createIfNotExists === false) { + url += '?createIfNotExists=false'; + } + + return this.as._jsonRequest({ + method: 'POST', + url: url, + body: partialObject, + hostType: 'write', + callback: callback + }); +}; + +/* +* Partially Override the content of several objects +* +* @param objects contains an array of objects to update (each object must contains a objectID attribute) +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that updateAt and taskID +*/ +Index.prototype.partialUpdateObjects = function(objects, createIfNotExists, callback) { + if (arguments.length === 1 || typeof createIfNotExists === 'function') { + callback = createIfNotExists; + createIfNotExists = true; + } + + var isArray = require(8); + var usage = 'Usage: index.partialUpdateObjects(arrayOfObjects[, callback])'; + + if (!isArray(objects)) { + throw new Error(usage); + } + + var indexObj = this; + var postObj = { + requests: [] + }; + for (var i = 0; i < objects.length; ++i) { + var request = { + action: createIfNotExists === true ? 'partialUpdateObject' : 'partialUpdateObjectNoCreate', + objectID: objects[i].objectID, + body: objects[i] + }; + postObj.requests.push(request); + } + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/* +* Override the content of object +* +* @param object contains the javascript object to save, the object must contains an objectID attribute +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that updateAt and taskID +*/ +Index.prototype.saveObject = function(object, callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'PUT', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(object.objectID), + body: object, + hostType: 'write', + callback: callback + }); +}; + +/* +* Override the content of several objects +* +* @param objects contains an array of objects to update (each object must contains a objectID attribute) +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that updateAt and taskID +*/ +Index.prototype.saveObjects = function(objects, callback) { + var isArray = require(8); + var usage = 'Usage: index.saveObjects(arrayOfObjects[, callback])'; + + if (!isArray(objects)) { + throw new Error(usage); + } + + var indexObj = this; + var postObj = { + requests: [] + }; + for (var i = 0; i < objects.length; ++i) { + var request = { + action: 'updateObject', + objectID: objects[i].objectID, + body: objects[i] + }; + postObj.requests.push(request); + } + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/* +* Delete an object from the index +* +* @param objectID the unique identifier of object to delete +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that contains 3 elements: createAt, taskId and objectID +*/ +Index.prototype.deleteObject = function(objectID, callback) { + if (typeof objectID === 'function' || typeof objectID !== 'string' && typeof objectID !== 'number') { + var err = new errors.AlgoliaSearchError( + objectID && typeof objectID !== 'function' + ? 'ObjectID must be a string' + : 'Cannot delete an object without an objectID' + ); + callback = objectID; + if (typeof callback === 'function') { + return callback(err); + } + + return this.as._promise.reject(err); + } + + var indexObj = this; + return this.as._jsonRequest({ + method: 'DELETE', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID), + hostType: 'write', + callback: callback + }); +}; + +/* +* Delete several objects from an index +* +* @param objectIDs contains an array of objectID to delete +* @param callback (optional) the result callback called with two arguments: +* error: null or Error('message') +* content: the server answer that contains 3 elements: createAt, taskId and objectID +*/ +Index.prototype.deleteObjects = function(objectIDs, callback) { + var isArray = require(8); + var map = require(32); + + var usage = 'Usage: index.deleteObjects(arrayOfObjectIDs[, callback])'; + + if (!isArray(objectIDs)) { + throw new Error(usage); + } + + var indexObj = this; + var postObj = { + requests: map(objectIDs, function prepareRequest(objectID) { + return { + action: 'deleteObject', + objectID: objectID, + body: { + objectID: objectID + } + }; + }) + }; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/batch', + body: postObj, + hostType: 'write', + callback: callback + }); +}; + +/* +* Delete all objects matching a query +* +* @param query the query string +* @param params the optional query parameters +* @param callback (optional) the result callback called with one argument +* error: null or Error('message') +* @deprecated see index.deleteBy +*/ +Index.prototype.deleteByQuery = deprecate(function(query, params, callback) { + var clone = require(26); + var map = require(32); + + var indexObj = this; + var client = indexObj.as; + + if (arguments.length === 1 || typeof params === 'function') { + callback = params; + params = {}; + } else { + params = clone(params); + } + + params.attributesToRetrieve = 'objectID'; + params.hitsPerPage = 1000; + params.distinct = false; + + // when deleting, we should never use cache to get the + // search results + this.clearCache(); + + // there's a problem in how we use the promise chain, + // see how waitTask is done + var promise = this + .search(query, params) + .then(stopOrDelete); + + function stopOrDelete(searchContent) { + // stop here + if (searchContent.nbHits === 0) { + // return indexObj.as._request.resolve(); + return searchContent; + } + + // continue and do a recursive call + var objectIDs = map(searchContent.hits, function getObjectID(object) { + return object.objectID; + }); + + return indexObj + .deleteObjects(objectIDs) + .then(waitTask) + .then(doDeleteByQuery); + } + + function waitTask(deleteObjectsContent) { + return indexObj.waitTask(deleteObjectsContent.taskID); + } + + function doDeleteByQuery() { + return indexObj.deleteByQuery(query, params); + } + + if (!callback) { + return promise; + } + + promise.then(success, failure); + + function success() { + exitPromise(function exit() { + callback(null); + }, client._setTimeout || setTimeout); + } + + function failure(err) { + exitPromise(function exit() { + callback(err); + }, client._setTimeout || setTimeout); + } +}, deprecatedMessage('index.deleteByQuery()', 'index.deleteBy()')); + +/** +* Delete all objects matching a query +* +* the query parameters that can be used are: +* - filters (numeric, facet, tag) +* - geo +* +* you can not send an empty query or filters +* +* @param params the optional query parameters +* @param callback (optional) the result callback called with one argument +* error: null or Error('message') +*/ +Index.prototype.deleteBy = function(params, callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/deleteByQuery', + body: {params: indexObj.as._getSearchParams(params, '')}, + hostType: 'write', + callback: callback + }); +}; + +/* +* Browse all content from an index using events. Basically this will do +* .browse() -> .browseFrom -> .browseFrom -> .. until all the results are returned +* +* @param {string} query - The full text query +* @param {Object} [queryParameters] - Any search query parameter +* @return {EventEmitter} +* @example +* var browser = index.browseAll('cool songs', { +* tagFilters: 'public,comments', +* hitsPerPage: 500 +* }); +* +* browser.on('result', function resultCallback(content) { +* console.log(content.hits); +* }); +* +* // if any error occurs, you get it +* browser.on('error', function(err) { +* throw err; +* }); +* +* // when you have browsed the whole index, you get this event +* browser.on('end', function() { +* console.log('finished'); +* }); +* +* // at any point if you want to stop the browsing process, you can stop it manually +* // otherwise it will go on and on +* browser.stop(); +* +* @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation} +*/ +Index.prototype.browseAll = function(query, queryParameters) { + if (typeof query === 'object') { + queryParameters = query; + query = undefined; + } + + var merge = require(33); + + var IndexBrowser = require(19); + + var browser = new IndexBrowser(); + var client = this.as; + var index = this; + var params = client._getSearchParams( + merge({}, queryParameters || {}, { + query: query + }), '' + ); + + // start browsing + browseLoop(); + + function browseLoop(cursor) { + if (browser._stopped) { + return; + } + + var body; + + if (cursor !== undefined) { + body = { + cursor: cursor + }; + } else { + body = { + params: params + }; + } + + client._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(index.indexName) + '/browse', + hostType: 'read', + body: body, + callback: browseCallback + }); + } + + function browseCallback(err, content) { + if (browser._stopped) { + return; + } + + if (err) { + browser._error(err); + return; + } + + browser._result(content); + + // no cursor means we are finished browsing + if (content.cursor === undefined) { + browser._end(); + return; + } + + browseLoop(content.cursor); + } + + return browser; +}; + +/* +* Get a Typeahead.js adapter +* @param searchParams contains an object with query parameters (see search for details) +*/ +Index.prototype.ttAdapter = deprecate(function(params) { + var self = this; + return function ttAdapter(query, syncCb, asyncCb) { + var cb; + + if (typeof asyncCb === 'function') { + // typeahead 0.11 + cb = asyncCb; + } else { + // pre typeahead 0.11 + cb = syncCb; + } + + self.search(query, params, function searchDone(err, content) { + if (err) { + cb(err); + return; + } + + cb(content.hits); + }); + }; +}, +'ttAdapter is not necessary anymore and will be removed in the next version,\n' + +'have a look at autocomplete.js (https://github.com/algolia/autocomplete.js)'); + +/* +* Wait the publication of a task on the server. +* All server task are asynchronous and you can check with this method that the task is published. +* +* @param taskID the id of the task returned by server +* @param callback the result callback with with two arguments: +* error: null or Error('message') +* content: the server answer that contains the list of results +*/ +Index.prototype.waitTask = function(taskID, callback) { + // wait minimum 100ms before retrying + var baseDelay = 100; + // wait maximum 5s before retrying + var maxDelay = 5000; + var loop = 0; + + // waitTask() must be handled differently from other methods, + // it's a recursive method using a timeout + var indexObj = this; + var client = indexObj.as; + + var promise = retryLoop(); + + function retryLoop() { + return client._jsonRequest({ + method: 'GET', + hostType: 'read', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/task/' + taskID + }).then(function success(content) { + loop++; + var delay = baseDelay * loop * loop; + if (delay > maxDelay) { + delay = maxDelay; + } + + if (content.status !== 'published') { + return client._promise.delay(delay).then(retryLoop); + } + + return content; + }); + } + + if (!callback) { + return promise; + } + + promise.then(successCb, failureCb); + + function successCb(content) { + exitPromise(function exit() { + callback(null, content); + }, client._setTimeout || setTimeout); + } + + function failureCb(err) { + exitPromise(function exit() { + callback(err); + }, client._setTimeout || setTimeout); + } +}; + +/* +* This function deletes the index content. Settings and index specific API keys are kept untouched. +* +* @param callback (optional) the result callback called with two arguments +* error: null or Error('message') +* content: the settings object or the error message if a failure occurred +*/ +Index.prototype.clearIndex = function(callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/clear', + hostType: 'write', + callback: callback + }); +}; + +/* +* Get settings of this index +* +* @param opts an object of options to add +* @param opts.advanced get more settings like nbShards (useful for Enterprise) +* @param callback (optional) the result callback called with two arguments +* error: null or Error('message') +* content: the settings object or the error message if a failure occurred +*/ +Index.prototype.getSettings = function(opts, callback) { + if (arguments.length === 1 && typeof opts === 'function') { + callback = opts; + opts = {}; + } + opts = opts || {}; + + var indexName = encodeURIComponent(this.indexName); + return this.as._jsonRequest({ + method: 'GET', + url: + '/1/indexes/' + + indexName + + '/settings?getVersion=2' + + (opts.advanced ? '&advanced=' + opts.advanced : ''), + hostType: 'read', + callback: callback + }); +}; + +Index.prototype.searchSynonyms = function(params, callback) { + if (typeof params === 'function') { + callback = params; + params = {}; + } else if (params === undefined) { + params = {}; + } + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/search', + body: params, + hostType: 'read', + callback: callback + }); +}; + +function exportData(method, _hitsPerPage, callback) { + function search(page, _previous) { + var options = { + page: page || 0, + hitsPerPage: _hitsPerPage || 100 + }; + var previous = _previous || []; + + return method(options).then(function(result) { + var hits = result.hits; + var nbHits = result.nbHits; + var current = hits.map(function(s) { + delete s._highlightResult; + return s; + }); + var synonyms = previous.concat(current); + if (synonyms.length < nbHits) { + return search(options.page + 1, synonyms); + } + return synonyms; + }); + } + return search().then(function(data) { + if (typeof callback === 'function') { + callback(data); + return undefined; + } + return data; + }); +} + +/** + * Retrieve all the synonyms in an index + * @param [number=100] hitsPerPage The amount of synonyms to retrieve per batch + * @param [function] callback will be called after all synonyms are retrieved + */ +Index.prototype.exportSynonyms = function(hitsPerPage, callback) { + return exportData(this.searchSynonyms.bind(this), hitsPerPage, callback); +}; + +Index.prototype.saveSynonym = function(synonym, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + if (opts.forwardToSlaves !== undefined) deprecateForwardToSlaves(); + var forwardToReplicas = (opts.forwardToSlaves || opts.forwardToReplicas) ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'PUT', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/' + encodeURIComponent(synonym.objectID) + + '?forwardToReplicas=' + forwardToReplicas, + body: synonym, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.getSynonym = function(objectID, callback) { + return this.as._jsonRequest({ + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/' + encodeURIComponent(objectID), + hostType: 'read', + callback: callback + }); +}; + +Index.prototype.deleteSynonym = function(objectID, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + if (opts.forwardToSlaves !== undefined) deprecateForwardToSlaves(); + var forwardToReplicas = (opts.forwardToSlaves || opts.forwardToReplicas) ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'DELETE', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/' + encodeURIComponent(objectID) + + '?forwardToReplicas=' + forwardToReplicas, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.clearSynonyms = function(opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + if (opts.forwardToSlaves !== undefined) deprecateForwardToSlaves(); + var forwardToReplicas = (opts.forwardToSlaves || opts.forwardToReplicas) ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/clear' + + '?forwardToReplicas=' + forwardToReplicas, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.batchSynonyms = function(synonyms, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + if (opts.forwardToSlaves !== undefined) deprecateForwardToSlaves(); + var forwardToReplicas = (opts.forwardToSlaves || opts.forwardToReplicas) ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/synonyms/batch' + + '?forwardToReplicas=' + forwardToReplicas + + '&replaceExistingSynonyms=' + (opts.replaceExistingSynonyms ? 'true' : 'false'), + hostType: 'write', + body: synonyms, + callback: callback + }); +}; + +Index.prototype.searchRules = function(params, callback) { + if (typeof params === 'function') { + callback = params; + params = {}; + } else if (params === undefined) { + params = {}; + } + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/search', + body: params, + hostType: 'read', + callback: callback + }); +}; +/** + * Retrieve all the query rules in an index + * @param [number=100] hitsPerPage The amount of query rules to retrieve per batch + * @param [function] callback will be called after all query rules are retrieved + * error: null or Error('message') + */ +Index.prototype.exportRules = function(hitsPerPage, callback) { + return exportData(this.searchRules.bind(this), hitsPerPage, callback); +}; + +Index.prototype.saveRule = function(rule, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + if (!rule.objectID) { + throw new errors.AlgoliaSearchError('Missing or empty objectID field for rule'); + } + + var forwardToReplicas = opts.forwardToReplicas === true ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'PUT', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/' + encodeURIComponent(rule.objectID) + + '?forwardToReplicas=' + forwardToReplicas, + body: rule, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.getRule = function(objectID, callback) { + return this.as._jsonRequest({ + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/' + encodeURIComponent(objectID), + hostType: 'read', + callback: callback + }); +}; + +Index.prototype.deleteRule = function(objectID, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + var forwardToReplicas = opts.forwardToReplicas === true ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'DELETE', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/' + encodeURIComponent(objectID) + + '?forwardToReplicas=' + forwardToReplicas, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.clearRules = function(opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + var forwardToReplicas = opts.forwardToReplicas === true ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/clear' + + '?forwardToReplicas=' + forwardToReplicas, + hostType: 'write', + callback: callback + }); +}; + +Index.prototype.batchRules = function(rules, opts, callback) { + if (typeof opts === 'function') { + callback = opts; + opts = {}; + } else if (opts === undefined) { + opts = {}; + } + + var forwardToReplicas = opts.forwardToReplicas === true ? 'true' : 'false'; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/rules/batch' + + '?forwardToReplicas=' + forwardToReplicas + + '&clearExistingRules=' + (opts.clearExistingRules === true ? 'true' : 'false'), + hostType: 'write', + body: rules, + callback: callback + }); +}; + +Index.prototype.exists = function(callback) { + var result = this.getSettings().then(function() { + return true; + }).catch(function(err) { + if (err instanceof errors.AlgoliaSearchError && err.statusCode === 404) { + return false; + } + + throw err; + }); + + if (typeof callback !== 'function') { + return result; + } + + result.then(function(res) { + callback(null, res); + }).catch(function(err) { + callback(err); + }); +}; + +Index.prototype.findObject = function(findCallback, requestOptions, callback) { + requestOptions = requestOptions === undefined ? {} : requestOptions; + var paginate = requestOptions.paginate !== undefined ? requestOptions.paginate : true; + var query = requestOptions.query !== undefined ? requestOptions.query : ''; + + var that = this; + var page = 0; + + var paginateLoop = function() { + requestOptions.page = page; + + return that.search(query, requestOptions).then(function(result) { + var hits = result.hits; + + for (var position = 0; position < hits.length; position++) { + var hit = hits[position]; + if (findCallback(hit)) { + return { + object: hit, + position: position, + page: page + }; + } + } + + page += 1; + + // paginate if option was set and has next page + if (!paginate || page >= result.nbPages) { + throw new errors.ObjectNotFound('Object not found'); + } + + return paginateLoop(); + }); + }; + + var promise = paginateLoop(page); + + if (callback === undefined) { + return promise; + } + + promise + .then(function(res) { + callback(null, res); + }) + .catch(function(err) { + callback(err); + }); +}; + +Index.prototype.getObjectPosition = function(result, objectID) { + var hits = result.hits; + + for (var position = 0; position < hits.length; position++) { + if (hits[position].objectID === objectID) { + return position; + } + } + + return -1; +}; + +/* +* Set settings for this index +* +* @param settings the settings object that can contains : +* - minWordSizefor1Typo: (integer) the minimum number of characters to accept one typo (default = 3). +* - minWordSizefor2Typos: (integer) the minimum number of characters to accept two typos (default = 7). +* - hitsPerPage: (integer) the number of hits per page (default = 10). +* - attributesToRetrieve: (array of strings) default list of attributes to retrieve in objects. +* If set to null, all attributes are retrieved. +* - attributesToHighlight: (array of strings) default list of attributes to highlight. +* If set to null, all indexed attributes are highlighted. +* - attributesToSnippet**: (array of strings) default list of attributes to snippet alongside the number +* of words to return (syntax is attributeName:nbWords). +* By default no snippet is computed. If set to null, no snippet is computed. +* - attributesToIndex: (array of strings) the list of fields you want to index. +* If set to null, all textual and numerical attributes of your objects are indexed, +* but you should update it to get optimal results. +* This parameter has two important uses: +* - Limit the attributes to index: For example if you store a binary image in base64, +* you want to store it and be able to +* retrieve it but you don't want to search in the base64 string. +* - Control part of the ranking*: (see the ranking parameter for full explanation) +* Matches in attributes at the beginning of +* the list will be considered more important than matches in attributes further down the list. +* In one attribute, matching text at the beginning of the attribute will be +* considered more important than text after, you can disable +* this behavior if you add your attribute inside `unordered(AttributeName)`, +* for example attributesToIndex: ["title", "unordered(text)"]. +* - attributesForFaceting: (array of strings) The list of fields you want to use for faceting. +* All strings in the attribute selected for faceting are extracted and added as a facet. +* If set to null, no attribute is used for faceting. +* - attributeForDistinct: (string) The attribute name used for the Distinct feature. +* This feature is similar to the SQL "distinct" keyword: when enabled +* in query with the distinct=1 parameter, all hits containing a duplicate +* value for this attribute are removed from results. +* For example, if the chosen attribute is show_name and several hits have +* the same value for show_name, then only the best one is kept and others are removed. +* - ranking: (array of strings) controls the way results are sorted. +* We have six available criteria: +* - typo: sort according to number of typos, +* - geo: sort according to decreassing distance when performing a geo-location based search, +* - proximity: sort according to the proximity of query words in hits, +* - attribute: sort according to the order of attributes defined by attributesToIndex, +* - exact: +* - if the user query contains one word: sort objects having an attribute +* that is exactly the query word before others. +* For example if you search for the "V" TV show, you want to find it +* with the "V" query and avoid to have all popular TV +* show starting by the v letter before it. +* - if the user query contains multiple words: sort according to the +* number of words that matched exactly (and not as a prefix). +* - custom: sort according to a user defined formula set in **customRanking** attribute. +* The standard order is ["typo", "geo", "proximity", "attribute", "exact", "custom"] +* - customRanking: (array of strings) lets you specify part of the ranking. +* The syntax of this condition is an array of strings containing attributes +* prefixed by asc (ascending order) or desc (descending order) operator. +* For example `"customRanking" => ["desc(population)", "asc(name)"]` +* - queryType: Select how the query words are interpreted, it can be one of the following value: +* - prefixAll: all query words are interpreted as prefixes, +* - prefixLast: only the last word is interpreted as a prefix (default behavior), +* - prefixNone: no query word is interpreted as a prefix. This option is not recommended. +* - highlightPreTag: (string) Specify the string that is inserted before +* the highlighted parts in the query result (default to ""). +* - highlightPostTag: (string) Specify the string that is inserted after +* the highlighted parts in the query result (default to ""). +* - optionalWords: (array of strings) Specify a list of words that should +* be considered as optional when found in the query. +* @param callback (optional) the result callback called with two arguments +* error: null or Error('message') +* content: the server answer or the error message if a failure occurred +*/ +Index.prototype.setSettings = function(settings, opts, callback) { + if (arguments.length === 1 || typeof opts === 'function') { + callback = opts; + opts = {}; + } + + if (opts.forwardToSlaves !== undefined) deprecateForwardToSlaves(); + var forwardToReplicas = (opts.forwardToSlaves || opts.forwardToReplicas) ? 'true' : 'false'; + + var indexObj = this; + return this.as._jsonRequest({ + method: 'PUT', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/settings?forwardToReplicas=' + + forwardToReplicas, + hostType: 'write', + body: settings, + callback: callback + }); +}; + +/* +* @deprecated see client.listApiKeys() +*/ +Index.prototype.listUserKeys = deprecate(function(callback) { + return this.listApiKeys(callback); +}, deprecatedMessage('index.listUserKeys()', 'client.listApiKeys()')); + +/* +* List all existing API keys to this index +* +* @param callback the result callback called with two arguments +* error: null or Error('message') +* content: the server answer with API keys belonging to the index +* +* @deprecated see client.listApiKeys() +*/ +Index.prototype.listApiKeys = deprecate(function(callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys', + hostType: 'read', + callback: callback + }); +}, deprecatedMessage('index.listApiKeys()', 'client.listApiKeys()')); + +/* +* @deprecated see client.getApiKey() +*/ +Index.prototype.getUserKeyACL = deprecate(function(key, callback) { + return this.getApiKey(key, callback); +}, deprecatedMessage('index.getUserKeyACL()', 'client.getApiKey()')); + + +/* +* Get an API key from this index +* +* @param key +* @param callback the result callback called with two arguments +* error: null or Error('message') +* content: the server answer with the right API key +* +* @deprecated see client.getApiKey() +*/ +Index.prototype.getApiKey = deprecate(function(key, callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys/' + key, + hostType: 'read', + callback: callback + }); +}, deprecatedMessage('index.getApiKey()', 'client.getApiKey()')); + +/* +* @deprecated see client.deleteApiKey() +*/ +Index.prototype.deleteUserKey = deprecate(function(key, callback) { + return this.deleteApiKey(key, callback); +}, deprecatedMessage('index.deleteUserKey()', 'client.deleteApiKey()')); + +/* +* Delete an existing API key associated to this index +* +* @param key +* @param callback the result callback called with two arguments +* error: null or Error('message') +* content: the server answer with the deletion date +* +* @deprecated see client.deleteApiKey() +*/ +Index.prototype.deleteApiKey = deprecate(function(key, callback) { + var indexObj = this; + return this.as._jsonRequest({ + method: 'DELETE', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/keys/' + key, + hostType: 'write', + callback: callback + }); +}, deprecatedMessage('index.deleteApiKey()', 'client.deleteApiKey()')); + +/* +* @deprecated see client.addApiKey() +*/ +Index.prototype.addUserKey = deprecate(function(acls, params, callback) { + return this.addApiKey(acls, params, callback); +}, deprecatedMessage('index.addUserKey()', 'client.addApiKey()')); + +/* +* Add a new API key to this index +* +* @param {string[]} acls - The list of ACL for this key. Defined by an array of strings that +* can contains the following values: +* - search: allow to search (https and http) +* - addObject: allows to add/update an object in the index (https only) +* - deleteObject : allows to delete an existing object (https only) +* - deleteIndex : allows to delete index content (https only) +* - settings : allows to get index settings (https only) +* - editSettings : allows to change index settings (https only) +* @param {Object} [params] - Optionnal parameters to set for the key +* @param {number} params.validity - Number of seconds after which the key will +* be automatically removed (0 means no time limit for this key) +* @param {number} params.maxQueriesPerIPPerHour - Number of API calls allowed from an IP address per hour +* @param {number} params.maxHitsPerQuery - Number of hits this API key can retrieve in one call +* @param {string} params.description - A description for your key +* @param {string[]} params.referers - A list of authorized referers +* @param {Object} params.queryParameters - Force the key to use specific query parameters +* @param {Function} callback - The result callback called with two arguments +* error: null or Error('message') +* content: the server answer with the added API key +* @return {Promise|undefined} Returns a promise if no callback given +* @example +* index.addUserKey(['search'], { +* validity: 300, +* maxQueriesPerIPPerHour: 2000, +* maxHitsPerQuery: 3, +* description: 'Eat three fruits', +* referers: ['*.algolia.com'], +* queryParameters: { +* tagFilters: ['public'], +* } +* }) +* @see {@link https://www.algolia.com/doc/rest_api#AddIndexKey|Algolia REST API Documentation} +* +* @deprecated see client.addApiKey() +*/ +Index.prototype.addApiKey = deprecate(function(acls, params, callback) { + var isArray = require(8); + var usage = 'Usage: index.addApiKey(arrayOfAcls[, params, callback])'; + + if (!isArray(acls)) { + throw new Error(usage); + } + + if (arguments.length === 1 || typeof params === 'function') { + callback = params; + params = null; + } + + var postObj = { + acl: acls + }; + + if (params) { + postObj.validity = params.validity; + postObj.maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour; + postObj.maxHitsPerQuery = params.maxHitsPerQuery; + postObj.description = params.description; + + if (params.queryParameters) { + postObj.queryParameters = this.as._getSearchParams(params.queryParameters, ''); + } + + postObj.referers = params.referers; + } + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/keys', + body: postObj, + hostType: 'write', + callback: callback + }); +}, deprecatedMessage('index.addApiKey()', 'client.addApiKey()')); + +/** +* @deprecated use client.addApiKey() +*/ +Index.prototype.addUserKeyWithValidity = deprecate(function deprecatedAddUserKeyWithValidity(acls, params, callback) { + return this.addApiKey(acls, params, callback); +}, deprecatedMessage('index.addUserKeyWithValidity()', 'client.addApiKey()')); + +/* +* @deprecated see client.updateApiKey() +*/ +Index.prototype.updateUserKey = deprecate(function(key, acls, params, callback) { + return this.updateApiKey(key, acls, params, callback); +}, deprecatedMessage('index.updateUserKey()', 'client.updateApiKey()')); + +/** +* Update an existing API key of this index +* @param {string} key - The key to update +* @param {string[]} acls - The list of ACL for this key. Defined by an array of strings that +* can contains the following values: +* - search: allow to search (https and http) +* - addObject: allows to add/update an object in the index (https only) +* - deleteObject : allows to delete an existing object (https only) +* - deleteIndex : allows to delete index content (https only) +* - settings : allows to get index settings (https only) +* - editSettings : allows to change index settings (https only) +* @param {Object} [params] - Optionnal parameters to set for the key +* @param {number} params.validity - Number of seconds after which the key will +* be automatically removed (0 means no time limit for this key) +* @param {number} params.maxQueriesPerIPPerHour - Number of API calls allowed from an IP address per hour +* @param {number} params.maxHitsPerQuery - Number of hits this API key can retrieve in one call +* @param {string} params.description - A description for your key +* @param {string[]} params.referers - A list of authorized referers +* @param {Object} params.queryParameters - Force the key to use specific query parameters +* @param {Function} callback - The result callback called with two arguments +* error: null or Error('message') +* content: the server answer with user keys list +* @return {Promise|undefined} Returns a promise if no callback given +* @example +* index.updateApiKey('APIKEY', ['search'], { +* validity: 300, +* maxQueriesPerIPPerHour: 2000, +* maxHitsPerQuery: 3, +* description: 'Eat three fruits', +* referers: ['*.algolia.com'], +* queryParameters: { +* tagFilters: ['public'], +* } +* }) +* @see {@link https://www.algolia.com/doc/rest_api#UpdateIndexKey|Algolia REST API Documentation} +* +* @deprecated see client.updateApiKey() +*/ +Index.prototype.updateApiKey = deprecate(function(key, acls, params, callback) { + var isArray = require(8); + var usage = 'Usage: index.updateApiKey(key, arrayOfAcls[, params, callback])'; + + if (!isArray(acls)) { + throw new Error(usage); + } + + if (arguments.length === 2 || typeof params === 'function') { + callback = params; + params = null; + } + + var putObj = { + acl: acls + }; + + if (params) { + putObj.validity = params.validity; + putObj.maxQueriesPerIPPerHour = params.maxQueriesPerIPPerHour; + putObj.maxHitsPerQuery = params.maxHitsPerQuery; + putObj.description = params.description; + + if (params.queryParameters) { + putObj.queryParameters = this.as._getSearchParams(params.queryParameters, ''); + } + + putObj.referers = params.referers; + } + + return this.as._jsonRequest({ + method: 'PUT', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/keys/' + key, + body: putObj, + hostType: 'write', + callback: callback + }); +}, deprecatedMessage('index.updateApiKey()', 'client.updateApiKey()')); + +},{"19":19,"20":20,"26":26,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"7":7,"8":8}],19:[function(require,module,exports){ +'use strict'; + +// This is the object returned by the `index.browseAll()` method + +module.exports = IndexBrowser; + +var inherits = require(7); +var EventEmitter = require(4).EventEmitter; + +function IndexBrowser() { +} + +inherits(IndexBrowser, EventEmitter); + +IndexBrowser.prototype.stop = function() { + this._stopped = true; + this._clean(); +}; + +IndexBrowser.prototype._end = function() { + this.emit('end'); + this._clean(); +}; + +IndexBrowser.prototype._error = function(err) { + this.emit('error', err); + this._clean(); +}; + +IndexBrowser.prototype._result = function(content) { + this.emit('result', content); +}; + +IndexBrowser.prototype._clean = function() { + this.removeAllListeners('stop'); + this.removeAllListeners('end'); + this.removeAllListeners('error'); + this.removeAllListeners('result'); +}; + +},{"4":4,"7":7}],20:[function(require,module,exports){ +var buildSearchMethod = require(25); +var deprecate = require(28); +var deprecatedMessage = require(29); + +module.exports = IndexCore; + +/* +* Index class constructor. +* You should not use this method directly but use initIndex() function +*/ +function IndexCore(algoliasearch, indexName) { + this.indexName = indexName; + this.as = algoliasearch; + this.typeAheadArgs = null; + this.typeAheadValueOption = null; + + // make sure every index instance has it's own cache + this.cache = {}; +} + +/* +* Clear all queries in cache +*/ +IndexCore.prototype.clearCache = function() { + this.cache = {}; +}; + +/* +* Search inside the index using XMLHttpRequest request (Using a POST query to +* minimize number of OPTIONS queries: Cross-Origin Resource Sharing). +* +* @param {string} [query] the full text query +* @param {object} [args] (optional) if set, contains an object with query parameters: +* - page: (integer) Pagination parameter used to select the page to retrieve. +* Page is zero-based and defaults to 0. Thus, +* to retrieve the 10th page you need to set page=9 +* - hitsPerPage: (integer) Pagination parameter used to select the number of hits per page. Defaults to 20. +* - attributesToRetrieve: a string that contains the list of object attributes +* you want to retrieve (let you minimize the answer size). +* Attributes are separated with a comma (for example "name,address"). +* You can also use an array (for example ["name","address"]). +* By default, all attributes are retrieved. You can also use '*' to retrieve all +* values when an attributesToRetrieve setting is specified for your index. +* - attributesToHighlight: a string that contains the list of attributes you +* want to highlight according to the query. +* Attributes are separated by a comma. You can also use an array (for example ["name","address"]). +* If an attribute has no match for the query, the raw value is returned. +* By default all indexed text attributes are highlighted. +* You can use `*` if you want to highlight all textual attributes. +* Numerical attributes are not highlighted. +* A matchLevel is returned for each highlighted attribute and can contain: +* - full: if all the query terms were found in the attribute, +* - partial: if only some of the query terms were found, +* - none: if none of the query terms were found. +* - attributesToSnippet: a string that contains the list of attributes to snippet alongside +* the number of words to return (syntax is `attributeName:nbWords`). +* Attributes are separated by a comma (Example: attributesToSnippet=name:10,content:10). +* You can also use an array (Example: attributesToSnippet: ['name:10','content:10']). +* By default no snippet is computed. +* - minWordSizefor1Typo: the minimum number of characters in a query word to accept one typo in this word. +* Defaults to 3. +* - minWordSizefor2Typos: the minimum number of characters in a query word +* to accept two typos in this word. Defaults to 7. +* - getRankingInfo: if set to 1, the result hits will contain ranking +* information in _rankingInfo attribute. +* - aroundLatLng: search for entries around a given +* latitude/longitude (specified as two floats separated by a comma). +* For example aroundLatLng=47.316669,5.016670). +* You can specify the maximum distance in meters with the aroundRadius parameter (in meters) +* and the precision for ranking with aroundPrecision +* (for example if you set aroundPrecision=100, two objects that are distant of +* less than 100m will be considered as identical for "geo" ranking parameter). +* At indexing, you should specify geoloc of an object with the _geoloc attribute +* (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}}) +* - insideBoundingBox: search entries inside a given area defined by the two extreme points +* of a rectangle (defined by 4 floats: p1Lat,p1Lng,p2Lat,p2Lng). +* For example insideBoundingBox=47.3165,4.9665,47.3424,5.0201). +* At indexing, you should specify geoloc of an object with the _geoloc attribute +* (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}}) +* - numericFilters: a string that contains the list of numeric filters you want to +* apply separated by a comma. +* The syntax of one filter is `attributeName` followed by `operand` followed by `value`. +* Supported operands are `<`, `<=`, `=`, `>` and `>=`. +* You can have multiple conditions on one attribute like for example numericFilters=price>100,price<1000. +* You can also use an array (for example numericFilters: ["price>100","price<1000"]). +* - tagFilters: filter the query by a set of tags. You can AND tags by separating them by commas. +* To OR tags, you must add parentheses. For example, tags=tag1,(tag2,tag3) means tag1 AND (tag2 OR tag3). +* You can also use an array, for example tagFilters: ["tag1",["tag2","tag3"]] +* means tag1 AND (tag2 OR tag3). +* At indexing, tags should be added in the _tags** attribute +* of objects (for example {"_tags":["tag1","tag2"]}). +* - facetFilters: filter the query by a list of facets. +* Facets are separated by commas and each facet is encoded as `attributeName:value`. +* For example: `facetFilters=category:Book,author:John%20Doe`. +* You can also use an array (for example `["category:Book","author:John%20Doe"]`). +* - facets: List of object attributes that you want to use for faceting. +* Comma separated list: `"category,author"` or array `['category','author']` +* Only attributes that have been added in **attributesForFaceting** index setting +* can be used in this parameter. +* You can also use `*` to perform faceting on all attributes specified in **attributesForFaceting**. +* - queryType: select how the query words are interpreted, it can be one of the following value: +* - prefixAll: all query words are interpreted as prefixes, +* - prefixLast: only the last word is interpreted as a prefix (default behavior), +* - prefixNone: no query word is interpreted as a prefix. This option is not recommended. +* - optionalWords: a string that contains the list of words that should +* be considered as optional when found in the query. +* Comma separated and array are accepted. +* - distinct: If set to 1, enable the distinct feature (disabled by default) +* if the attributeForDistinct index setting is set. +* This feature is similar to the SQL "distinct" keyword: when enabled +* in a query with the distinct=1 parameter, +* all hits containing a duplicate value for the attributeForDistinct attribute are removed from results. +* For example, if the chosen attribute is show_name and several hits have +* the same value for show_name, then only the best +* one is kept and others are removed. +* - restrictSearchableAttributes: List of attributes you want to use for +* textual search (must be a subset of the attributesToIndex index setting) +* either comma separated or as an array +* @param {function} [callback] the result callback called with two arguments: +* error: null or Error('message'). If false, the content contains the error. +* content: the server answer that contains the list of results. +*/ +IndexCore.prototype.search = buildSearchMethod('query'); + +/* +* -- BETA -- +* Search a record similar to the query inside the index using XMLHttpRequest request (Using a POST query to +* minimize number of OPTIONS queries: Cross-Origin Resource Sharing). +* +* @param {string} [query] the similar query +* @param {object} [args] (optional) if set, contains an object with query parameters. +* All search parameters are supported (see search function), restrictSearchableAttributes and facetFilters +* are the two most useful to restrict the similar results and get more relevant content +*/ +IndexCore.prototype.similarSearch = deprecate( + buildSearchMethod('similarQuery'), + deprecatedMessage( + 'index.similarSearch(query[, callback])', + 'index.search({ similarQuery: query }[, callback])' + ) +); + +/* +* Browse index content. The response content will have a `cursor` property that you can use +* to browse subsequent pages for this query. Use `index.browseFrom(cursor)` when you want. +* +* @param {string} query - The full text query +* @param {Object} [queryParameters] - Any search query parameter +* @param {Function} [callback] - The result callback called with two arguments +* error: null or Error('message') +* content: the server answer with the browse result +* @return {Promise|undefined} Returns a promise if no callback given +* @example +* index.browse('cool songs', { +* tagFilters: 'public,comments', +* hitsPerPage: 500 +* }, callback); +* @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation} +*/ +IndexCore.prototype.browse = function(query, queryParameters, callback) { + var merge = require(33); + + var indexObj = this; + + var page; + var hitsPerPage; + + // we check variadic calls that are not the one defined + // .browse()/.browse(fn) + // => page = 0 + if (arguments.length === 0 || arguments.length === 1 && typeof arguments[0] === 'function') { + page = 0; + callback = arguments[0]; + query = undefined; + } else if (typeof arguments[0] === 'number') { + // .browse(2)/.browse(2, 10)/.browse(2, fn)/.browse(2, 10, fn) + page = arguments[0]; + if (typeof arguments[1] === 'number') { + hitsPerPage = arguments[1]; + } else if (typeof arguments[1] === 'function') { + callback = arguments[1]; + hitsPerPage = undefined; + } + query = undefined; + queryParameters = undefined; + } else if (typeof arguments[0] === 'object') { + // .browse(queryParameters)/.browse(queryParameters, cb) + if (typeof arguments[1] === 'function') { + callback = arguments[1]; + } + queryParameters = arguments[0]; + query = undefined; + } else if (typeof arguments[0] === 'string' && typeof arguments[1] === 'function') { + // .browse(query, cb) + callback = arguments[1]; + queryParameters = undefined; + } + + // otherwise it's a .browse(query)/.browse(query, queryParameters)/.browse(query, queryParameters, cb) + + // get search query parameters combining various possible calls + // to .browse(); + queryParameters = merge({}, queryParameters || {}, { + page: page, + hitsPerPage: hitsPerPage, + query: query + }); + + var params = this.as._getSearchParams(queryParameters, ''); + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/browse', + body: {params: params}, + hostType: 'read', + callback: callback + }); +}; + +/* +* Continue browsing from a previous position (cursor), obtained via a call to `.browse()`. +* +* @param {string} query - The full text query +* @param {Object} [queryParameters] - Any search query parameter +* @param {Function} [callback] - The result callback called with two arguments +* error: null or Error('message') +* content: the server answer with the browse result +* @return {Promise|undefined} Returns a promise if no callback given +* @example +* index.browseFrom('14lkfsakl32', callback); +* @see {@link https://www.algolia.com/doc/rest_api#Browse|Algolia REST API Documentation} +*/ +IndexCore.prototype.browseFrom = function(cursor, callback) { + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + encodeURIComponent(this.indexName) + '/browse', + body: {cursor: cursor}, + hostType: 'read', + callback: callback + }); +}; + +/* +* Search for facet values +* https://www.algolia.com/doc/rest-api/search#search-for-facet-values +* +* @param {string} params.facetName Facet name, name of the attribute to search for values in. +* Must be declared as a facet +* @param {string} params.facetQuery Query for the facet search +* @param {string} [params.*] Any search parameter of Algolia, +* see https://www.algolia.com/doc/api-client/javascript/search#search-parameters +* Pagination is not supported. The page and hitsPerPage parameters will be ignored. +* @param callback (optional) +*/ +IndexCore.prototype.searchForFacetValues = function(params, callback) { + var clone = require(26); + var omit = require(34); + var usage = 'Usage: index.searchForFacetValues({facetName, facetQuery, ...params}[, callback])'; + + if (params.facetName === undefined || params.facetQuery === undefined) { + throw new Error(usage); + } + + var facetName = params.facetName; + var filteredParams = omit(clone(params), function(keyName) { + return keyName === 'facetName'; + }); + var searchParameters = this.as._getSearchParams(filteredParams, ''); + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/' + + encodeURIComponent(this.indexName) + '/facets/' + encodeURIComponent(facetName) + '/query', + hostType: 'read', + body: {params: searchParameters}, + callback: callback + }); +}; + +IndexCore.prototype.searchFacet = deprecate(function(params, callback) { + return this.searchForFacetValues(params, callback); +}, deprecatedMessage( + 'index.searchFacet(params[, callback])', + 'index.searchForFacetValues(params[, callback])' +)); + +IndexCore.prototype._search = function(params, url, callback, additionalUA) { + return this.as._jsonRequest({ + cache: this.cache, + method: 'POST', + url: url || '/1/indexes/' + encodeURIComponent(this.indexName) + '/query', + body: {params: params}, + hostType: 'read', + fallback: { + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(this.indexName), + body: {params: params} + }, + callback: callback, + additionalUA: additionalUA + }); +}; + +/* +* Get an object from this index +* +* @param objectID the unique identifier of the object to retrieve +* @param attrs (optional) if set, contains the array of attribute names to retrieve +* @param callback (optional) the result callback called with two arguments +* error: null or Error('message') +* content: the object to retrieve or the error message if a failure occurred +*/ +IndexCore.prototype.getObject = function(objectID, attrs, callback) { + var indexObj = this; + + if (arguments.length === 1 || typeof attrs === 'function') { + callback = attrs; + attrs = undefined; + } + + var params = ''; + if (attrs !== undefined) { + params = '?attributes='; + for (var i = 0; i < attrs.length; ++i) { + if (i !== 0) { + params += ','; + } + params += attrs[i]; + } + } + + return this.as._jsonRequest({ + method: 'GET', + url: '/1/indexes/' + encodeURIComponent(indexObj.indexName) + '/' + encodeURIComponent(objectID) + params, + hostType: 'read', + callback: callback + }); +}; + +/* +* Get several objects from this index +* +* @param objectIDs the array of unique identifier of objects to retrieve +*/ +IndexCore.prototype.getObjects = function(objectIDs, attributesToRetrieve, callback) { + var isArray = require(8); + var map = require(32); + + var usage = 'Usage: index.getObjects(arrayOfObjectIDs[, callback])'; + + if (!isArray(objectIDs)) { + throw new Error(usage); + } + + var indexObj = this; + + if (arguments.length === 1 || typeof attributesToRetrieve === 'function') { + callback = attributesToRetrieve; + attributesToRetrieve = undefined; + } + + var body = { + requests: map(objectIDs, function prepareRequest(objectID) { + var request = { + indexName: indexObj.indexName, + objectID: objectID + }; + + if (attributesToRetrieve) { + request.attributesToRetrieve = attributesToRetrieve.join(','); + } + + return request; + }) + }; + + return this.as._jsonRequest({ + method: 'POST', + url: '/1/indexes/*/objects', + hostType: 'read', + body: body, + callback: callback + }); +}; + +IndexCore.prototype.as = null; +IndexCore.prototype.indexName = null; +IndexCore.prototype.typeAheadArgs = null; +IndexCore.prototype.typeAheadValueOption = null; + +},{"25":25,"26":26,"28":28,"29":29,"32":32,"33":33,"34":34,"8":8}],21:[function(require,module,exports){ +'use strict'; + +var AlgoliaSearch = require(16); +var createAlgoliasearch = require(22); + +module.exports = createAlgoliasearch(AlgoliaSearch, 'Browser'); + +},{"16":16,"22":22}],22:[function(require,module,exports){ +(function (process){ +'use strict'; + +var global = require(6); +var Promise = global.Promise || require(3).Promise; + +// This is the standalone browser build entry point +// Browser implementation of the Algolia Search JavaScript client, +// using XMLHttpRequest, XDomainRequest and JSONP as fallback +module.exports = function createAlgoliasearch(AlgoliaSearch, uaSuffix) { + var inherits = require(7); + var errors = require(30); + var inlineHeaders = require(23); + var jsonpRequest = require(24); + var places = require(35); + uaSuffix = uaSuffix || ''; + + if (process.env.NODE_ENV === 'debug') { + require(1).enable('algoliasearch*'); + } + + function algoliasearch(applicationID, apiKey, opts) { + var cloneDeep = require(26); + + opts = cloneDeep(opts || {}); + + opts._ua = opts._ua || algoliasearch.ua; + + return new AlgoliaSearchBrowser(applicationID, apiKey, opts); + } + + algoliasearch.version = require(37); + + algoliasearch.ua = + 'Algolia for JavaScript (' + algoliasearch.version + '); ' + uaSuffix; + + algoliasearch.initPlaces = places(algoliasearch); + + // we expose into window no matter how we are used, this will allow + // us to easily debug any website running algolia + global.__algolia = { + debug: require(1), + algoliasearch: algoliasearch + }; + + var support = { + hasXMLHttpRequest: 'XMLHttpRequest' in global, + hasXDomainRequest: 'XDomainRequest' in global + }; + + if (support.hasXMLHttpRequest) { + support.cors = 'withCredentials' in new XMLHttpRequest(); + } + + function AlgoliaSearchBrowser() { + // call AlgoliaSearch constructor + AlgoliaSearch.apply(this, arguments); + } + + inherits(AlgoliaSearchBrowser, AlgoliaSearch); + + AlgoliaSearchBrowser.prototype._request = function request(url, opts) { + return new Promise(function wrapRequest(resolve, reject) { + // no cors or XDomainRequest, no request + if (!support.cors && !support.hasXDomainRequest) { + // very old browser, not supported + reject(new errors.Network('CORS not supported')); + return; + } + + url = inlineHeaders(url, opts.headers); + + var body = opts.body; + var req = support.cors ? new XMLHttpRequest() : new XDomainRequest(); + var reqTimeout; + var timedOut; + var connected = false; + + reqTimeout = setTimeout(onTimeout, opts.timeouts.connect); + // we set an empty onprogress listener + // so that XDomainRequest on IE9 is not aborted + // refs: + // - https://github.com/algolia/algoliasearch-client-js/issues/76 + // - https://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified?forum=iewebdevelopment + req.onprogress = onProgress; + if ('onreadystatechange' in req) req.onreadystatechange = onReadyStateChange; + req.onload = onLoad; + req.onerror = onError; + + // do not rely on default XHR async flag, as some analytics code like hotjar + // breaks it and set it to false by default + if (req instanceof XMLHttpRequest) { + req.open(opts.method, url, true); + + // The Analytics API never accepts Auth headers as query string + // this option exists specifically for them. + if (opts.forceAuthHeaders) { + req.setRequestHeader( + 'x-algolia-application-id', + opts.headers['x-algolia-application-id'] + ); + req.setRequestHeader( + 'x-algolia-api-key', + opts.headers['x-algolia-api-key'] + ); + } + } else { + req.open(opts.method, url); + } + + // headers are meant to be sent after open + if (support.cors) { + if (body) { + if (opts.method === 'POST') { + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests + req.setRequestHeader('content-type', 'application/x-www-form-urlencoded'); + } else { + req.setRequestHeader('content-type', 'application/json'); + } + } + req.setRequestHeader('accept', 'application/json'); + } + + if (body) { + req.send(body); + } else { + req.send(); + } + + // event object not received in IE8, at least + // but we do not use it, still important to note + function onLoad(/* event */) { + // When browser does not supports req.timeout, we can + // have both a load and timeout event, since handled by a dumb setTimeout + if (timedOut) { + return; + } + + clearTimeout(reqTimeout); + + var out; + + try { + out = { + body: JSON.parse(req.responseText), + responseText: req.responseText, + statusCode: req.status, + // XDomainRequest does not have any response headers + headers: req.getAllResponseHeaders && req.getAllResponseHeaders() || {} + }; + } catch (e) { + out = new errors.UnparsableJSON({ + more: req.responseText + }); + } + + if (out instanceof errors.UnparsableJSON) { + reject(out); + } else { + resolve(out); + } + } + + function onError(event) { + if (timedOut) { + return; + } + + clearTimeout(reqTimeout); + + // error event is trigerred both with XDR/XHR on: + // - DNS error + // - unallowed cross domain request + reject( + new errors.Network({ + more: event + }) + ); + } + + function onTimeout() { + timedOut = true; + req.abort(); + + reject(new errors.RequestTimeout()); + } + + function onConnect() { + connected = true; + clearTimeout(reqTimeout); + reqTimeout = setTimeout(onTimeout, opts.timeouts.complete); + } + + function onProgress() { + if (!connected) onConnect(); + } + + function onReadyStateChange() { + if (!connected && req.readyState > 1) onConnect(); + } + }); + }; + + AlgoliaSearchBrowser.prototype._request.fallback = function requestFallback(url, opts) { + url = inlineHeaders(url, opts.headers); + + return new Promise(function wrapJsonpRequest(resolve, reject) { + jsonpRequest(url, opts, function jsonpRequestDone(err, content) { + if (err) { + reject(err); + return; + } + + resolve(content); + }); + }); + }; + + AlgoliaSearchBrowser.prototype._promise = { + reject: function rejectPromise(val) { + return Promise.reject(val); + }, + resolve: function resolvePromise(val) { + return Promise.resolve(val); + }, + delay: function delayPromise(ms) { + return new Promise(function resolveOnTimeout(resolve/* , reject*/) { + setTimeout(resolve, ms); + }); + }, + all: function all(promises) { + return Promise.all(promises); + } + }; + + return algoliasearch; +}; + +}).call(this,require(12)) +},{"1":1,"12":12,"23":23,"24":24,"26":26,"3":3,"30":30,"35":35,"37":37,"6":6,"7":7}],23:[function(require,module,exports){ +'use strict'; + +module.exports = inlineHeaders; + +var encode = require(14); + +function inlineHeaders(url, headers) { + if (/\?/.test(url)) { + url += '&'; + } else { + url += '?'; + } + + return url + encode(headers); +} + +},{"14":14}],24:[function(require,module,exports){ +'use strict'; + +module.exports = jsonpRequest; + +var errors = require(30); + +var JSONPCounter = 0; + +function jsonpRequest(url, opts, cb) { + if (opts.method !== 'GET') { + cb(new Error('Method ' + opts.method + ' ' + url + ' is not supported by JSONP.')); + return; + } + + opts.debug('JSONP: start'); + + var cbCalled = false; + var timedOut = false; + + JSONPCounter += 1; + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + var cbName = 'algoliaJSONP_' + JSONPCounter; + var done = false; + + window[cbName] = function(data) { + removeGlobals(); + + if (timedOut) { + opts.debug('JSONP: Late answer, ignoring'); + return; + } + + cbCalled = true; + + clean(); + + cb(null, { + body: data, + responseText: JSON.stringify(data)/* , + // We do not send the statusCode, there's no statusCode in JSONP, it will be + // computed using data.status && data.message like with XDR + statusCode*/ + }); + }; + + // add callback by hand + url += '&callback=' + cbName; + + // add body params manually + if (opts.jsonBody && opts.jsonBody.params) { + url += '&' + opts.jsonBody.params; + } + + var ontimeout = setTimeout(timeout, opts.timeouts.complete); + + // script onreadystatechange needed only for + // <= IE8 + // https://github.com/angular/angular.js/issues/4523 + script.onreadystatechange = readystatechange; + script.onload = success; + script.onerror = error; + + script.async = true; + script.defer = true; + script.src = url; + head.appendChild(script); + + function success() { + opts.debug('JSONP: success'); + + if (done || timedOut) { + return; + } + + done = true; + + // script loaded but did not call the fn => script loading error + if (!cbCalled) { + opts.debug('JSONP: Fail. Script loaded but did not call the callback'); + clean(); + cb(new errors.JSONPScriptFail()); + } + } + + function readystatechange() { + if (this.readyState === 'loaded' || this.readyState === 'complete') { + success(); + } + } + + function clean() { + clearTimeout(ontimeout); + script.onload = null; + script.onreadystatechange = null; + script.onerror = null; + head.removeChild(script); + } + + function removeGlobals() { + try { + delete window[cbName]; + delete window[cbName + '_loaded']; + } catch (e) { + window[cbName] = window[cbName + '_loaded'] = undefined; + } + } + + function timeout() { + opts.debug('JSONP: Script timeout'); + timedOut = true; + clean(); + cb(new errors.RequestTimeout()); + } + + function error() { + opts.debug('JSONP: Script error'); + + if (done || timedOut) { + return; + } + + clean(); + cb(new errors.JSONPScriptError()); + } +} + +},{"30":30}],25:[function(require,module,exports){ +module.exports = buildSearchMethod; + +var errors = require(30); + +/** + * Creates a search method to be used in clients + * @param {string} queryParam the name of the attribute used for the query + * @param {string} url the url + * @return {function} the search method + */ +function buildSearchMethod(queryParam, url) { + /** + * The search method. Prepares the data and send the query to Algolia. + * @param {string} query the string used for query search + * @param {object} args additional parameters to send with the search + * @param {function} [callback] the callback to be called with the client gets the answer + * @return {undefined|Promise} If the callback is not provided then this methods returns a Promise + */ + return function search(query, args, callback) { + // warn V2 users on how to search + if (typeof query === 'function' && typeof args === 'object' || + typeof callback === 'object') { + // .search(query, params, cb) + // .search(cb, params) + throw new errors.AlgoliaSearchError('index.search usage is index.search(query, params, cb)'); + } + + // Normalizing the function signature + if (arguments.length === 0 || typeof query === 'function') { + // Usage : .search(), .search(cb) + callback = query; + query = ''; + } else if (arguments.length === 1 || typeof args === 'function') { + // Usage : .search(query/args), .search(query, cb) + callback = args; + args = undefined; + } + // At this point we have 3 arguments with values + + // Usage : .search(args) // careful: typeof null === 'object' + if (typeof query === 'object' && query !== null) { + args = query; + query = undefined; + } else if (query === undefined || query === null) { // .search(undefined/null) + query = ''; + } + + var params = ''; + + if (query !== undefined) { + params += queryParam + '=' + encodeURIComponent(query); + } + + var additionalUA; + if (args !== undefined) { + if (args.additionalUA) { + additionalUA = args.additionalUA; + delete args.additionalUA; + } + // `_getSearchParams` will augment params, do not be fooled by the = versus += from previous if + params = this.as._getSearchParams(args, params); + } + + + return this._search(params, url, callback, additionalUA); + }; +} + +},{"30":30}],26:[function(require,module,exports){ +module.exports = function clone(obj) { + return JSON.parse(JSON.stringify(obj)); +}; + +},{}],27:[function(require,module,exports){ +module.exports = createAnalyticsClient; + +var algoliasearch = require(21); + +function createAnalyticsClient(appId, apiKey, opts) { + var analytics = {}; + + opts = opts || {}; + // there need to be 4 hosts, like on the client, since if requests fail, + // the counter goes up by 1, so we need to have the same amount of hosts + // 4 because: -dsn, -1, -2, -3 + // This is done because the APPID used for search will be the same for the analytics client created, + // and since the state of available hosts is shared by APPID globally for the module, we had issues + // where the hostIndex would be 1 while the array was only one entry (you got an empty host) + opts.hosts = opts.hosts || [ + 'analytics.algolia.com', + 'analytics.algolia.com', + 'analytics.algolia.com', + 'analytics.algolia.com' + ]; + opts.protocol = opts.protocol || 'https:'; + + analytics.as = algoliasearch(appId, apiKey, opts); + + analytics.getABTests = function(_params, callback) { + var params = params || {}; + var offset = params.offset || 0; + var limit = params.limit || 10; + + return this.as._jsonRequest({ + method: 'GET', + url: '/2/abtests?offset=' + encodeURIComponent(offset) + '&limit=' + encodeURIComponent(limit), + hostType: 'read', + forceAuthHeaders: true, + callback: callback + }); + }; + + analytics.getABTest = function(abTestID, callback) { + return this.as._jsonRequest({ + method: 'GET', + url: '/2/abtests/' + encodeURIComponent(abTestID), + hostType: 'read', + forceAuthHeaders: true, + callback: callback + }); + }; + + analytics.addABTest = function(abTest, callback) { + return this.as._jsonRequest({ + method: 'POST', + url: '/2/abtests', + body: abTest, + hostType: 'read', + forceAuthHeaders: true, + callback: callback + }); + }; + + analytics.stopABTest = function(abTestID, callback) { + return this.as._jsonRequest({ + method: 'POST', + url: '/2/abtests/' + encodeURIComponent(abTestID) + '/stop', + hostType: 'read', + forceAuthHeaders: true, + callback: callback + }); + }; + + analytics.deleteABTest = function(abTestID, callback) { + return this.as._jsonRequest({ + method: 'DELETE', + url: '/2/abtests/' + encodeURIComponent(abTestID), + hostType: 'write', + forceAuthHeaders: true, + callback: callback + }); + }; + + analytics.waitTask = function(indexName, taskID, callback) { + return this.as.initIndex(indexName).waitTask(taskID, callback); + }; + + return analytics; +} + +},{"21":21}],28:[function(require,module,exports){ +module.exports = function deprecate(fn, message) { + var warned = false; + + function deprecated() { + if (!warned) { + /* eslint no-console:0 */ + console.warn(message); + warned = true; + } + + return fn.apply(this, arguments); + } + + return deprecated; +}; + +},{}],29:[function(require,module,exports){ +module.exports = function deprecatedMessage(previousUsage, newUsage) { + var githubAnchorLink = previousUsage.toLowerCase() + .replace(/[\.\(\)]/g, ''); + + return 'algoliasearch: `' + previousUsage + '` was replaced by `' + newUsage + + '`. Please see https://github.com/algolia/algoliasearch-client-javascript/wiki/Deprecated#' + githubAnchorLink; +}; + +},{}],30:[function(require,module,exports){ +'use strict'; + +// This file hosts our error definitions +// We use custom error "types" so that we can act on them when we need it +// e.g.: if error instanceof errors.UnparsableJSON then.. + +var inherits = require(7); + +function AlgoliaSearchError(message, extraProperties) { + var forEach = require(5); + + var error = this; + + // try to get a stacktrace + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, this.constructor); + } else { + error.stack = (new Error()).stack || 'Cannot get a stacktrace, browser is too old'; + } + + this.name = 'AlgoliaSearchError'; + this.message = message || 'Unknown error'; + + if (extraProperties) { + forEach(extraProperties, function addToErrorObject(value, key) { + error[key] = value; + }); + } +} + +inherits(AlgoliaSearchError, Error); + +function createCustomError(name, message) { + function AlgoliaSearchCustomError() { + var args = Array.prototype.slice.call(arguments, 0); + + // custom message not set, use default + if (typeof args[0] !== 'string') { + args.unshift(message); + } + + AlgoliaSearchError.apply(this, args); + this.name = 'AlgoliaSearch' + name + 'Error'; + } + + inherits(AlgoliaSearchCustomError, AlgoliaSearchError); + + return AlgoliaSearchCustomError; +} + +// late exports to let various fn defs and inherits take place +module.exports = { + AlgoliaSearchError: AlgoliaSearchError, + UnparsableJSON: createCustomError( + 'UnparsableJSON', + 'Could not parse the incoming response as JSON, see err.more for details' + ), + RequestTimeout: createCustomError( + 'RequestTimeout', + 'Request timed out before getting a response' + ), + Network: createCustomError( + 'Network', + 'Network issue, see err.more for details' + ), + JSONPScriptFail: createCustomError( + 'JSONPScriptFail', + '"),window.ALGOLIA_SUPPORTS_DOCWRITE===!0?(document.write(''),n("document.write")()):r(o,n("DOMElement"))}catch(s){r(o,n("DOMElement"))}}function n(e){return function(){var t="AlgoliaSearch: loaded V2 script using "+e;window.console&&window.console.log&&window.console.log(t)}}t.exports=o},{1:1}],4:[function(e,t,r){"use strict";function o(){var e="-- AlgoliaSearch V2 => V3 error --\nYou are trying to use a new version of the AlgoliaSearch JavaScript client with an old notation.\nPlease read our migration guide at https://github.com/algolia/algoliasearch-client-js/wiki/Migration-guide-from-2.x.x-to-3.x.x\n-- /AlgoliaSearch V2 => V3 error --";window.AlgoliaSearch=function(){throw new Error(e)},window.AlgoliaSearchHelper=function(){throw new Error(e)},window.AlgoliaExplainResults=function(){throw new Error(e)}}t.exports=o},{}],5:[function(e,t,r){"use strict";function o(t){var r=e(2),o=e(3),n=e(4);r(t)?o(t):n()}o("algoliasearch")},{2:2,3:3,4:4}]},{},[5])(5)}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.algoliasearch=e()}}(function(){var e;return function t(e,r,o){function n(s,a){if(!r[s]){if(!e[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(i)return i(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=r[s]={exports:{}};e[s][0].call(l.exports,function(t){var r=e[s][1][t];return n(r?r:t)},l,l.exports,t,e,r,o)}return r[s].exports}for(var i="function"==typeof require&&require,s=0;s=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function i(e){var t=this.useColors;if(e[0]=(t?"%c":"")+this.namespace+(t?" %c":" ")+e[0]+(t?"%c ":" ")+"+"+r.humanize(this.diff),t){var o="color: "+this.color;e.splice(1,0,o,"color: inherit");var n=0,i=0;e[0].replace(/%[a-zA-Z%]/g,function(e){"%%"!==e&&(n++,"%c"===e&&(i=n))}),e.splice(i,0,o)}}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(e){try{null==e?r.storage.removeItem("debug"):r.storage.debug=e}catch(t){}}function c(){var e;try{e=r.storage.debug}catch(t){}return!e&&"undefined"!=typeof o&&"env"in o&&(e=o.env.DEBUG),e}function u(){try{return window.localStorage}catch(e){}}r=t.exports=e(2),r.log=s,r.formatArgs=i,r.save=a,r.load=c,r.useColors=n,r.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:u(),r.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],r.formatters.j=function(e){try{return JSON.stringify(e)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},r.enable(c())}).call(this,e(12))},{12:12,2:2}],2:[function(e,t,r){function o(e){var t,o=0;for(t in e)o=(o<<5)-o+e.charCodeAt(t),o|=0;return r.colors[Math.abs(o)%r.colors.length]}function n(e){function t(){if(t.enabled){var e=t,o=+new Date,n=o-(u||o);e.diff=n,e.prev=u,e.curr=o,u=o;for(var i=new Array(arguments.length),s=0;s0&&this._events[e].length>r&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},o.prototype.on=o.prototype.addListener,o.prototype.once=function(e,t){function r(){this.removeListener(e,r),o||(o=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var o=!1;return r.listener=t,this.on(e,r),this},o.prototype.removeListener=function(e,t){var r,o,i,a;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],i=r.length,o=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(s(r)){for(a=i;a-- >0;)if(r[a]===t||r[a].listener&&r[a].listener===t){o=a;break}if(o<0)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(o,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},o.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},o.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},o.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},o.listenerCount=function(e,t){return e.listenerCount(t)}},{}],5:[function(e,t,r){var o=Object.prototype.hasOwnProperty,n=Object.prototype.toString;t.exports=function(e,t,r){if("[object Function]"!==n.call(t))throw new TypeError("iterator must be a function");var i=e.length;if(i===+i)for(var s=0;s100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var r=parseFloat(t[1]),o=(t[2]||"ms").toLowerCase();switch(o){case"years":case"year":case"yrs":case"yr":case"y":return r*p;case"days":case"day":case"d":return r*l;case"hours":case"hour":case"hrs":case"hr":case"h":return r*u;case"minutes":case"minute":case"mins":case"min":case"m":return r*c;case"seconds":case"second":case"secs":case"sec":case"s":return r*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function n(e){return e>=l?Math.round(e/l)+"d":e>=u?Math.round(e/u)+"h":e>=c?Math.round(e/c)+"m":e>=a?Math.round(e/a)+"s":e+"ms"}function i(e){return s(e,l,"day")||s(e,u,"hour")||s(e,c,"minute")||s(e,a,"second")||e+" ms"}function s(e,t,r){if(!(e0)return o(e);if("number"===r&&isNaN(e)===!1)return t["long"]?i(e):n(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},{}],10:[function(e,t,r){"use strict";var o=Object.prototype.hasOwnProperty,n=Object.prototype.toString,i=Array.prototype.slice,s=e(11),a=Object.prototype.propertyIsEnumerable,c=!a.call({toString:null},"toString"),u=a.call(function(){},"prototype"),l=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],p=function(e){var t=e.constructor;return t&&t.prototype===e},d={$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},h=function(){if("undefined"==typeof window)return!1;for(var e in window)try{if(!d["$"+e]&&o.call(window,e)&&null!==window[e]&&"object"==typeof window[e])try{p(window[e])}catch(t){return!0}}catch(t){return!0}return!1}(),f=function(e){if("undefined"==typeof window||!h)return p(e);try{return p(e)}catch(t){return!1}},y=function(e){var t=null!==e&&"object"==typeof e,r="[object Function]"===n.call(e),i=s(e),a=t&&"[object String]"===n.call(e),p=[];if(!t&&!r&&!i)throw new TypeError("Object.keys called on a non-object");var d=u&&r;if(a&&e.length>0&&!o.call(e,0))for(var h=0;h0)for(var y=0;y=0&&"[object Function]"===o.call(e.callee)),r}},{}],12:[function(e,t,r){function o(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(e){if(p===setTimeout)return setTimeout(e,0);if((p===o||!p)&&setTimeout)return p=setTimeout,setTimeout(e,0);try{return p(e,0)}catch(t){try{return p.call(null,e,0)}catch(t){return p.call(this,e,0)}}}function s(e){if(d===clearTimeout)return clearTimeout(e);if((d===n||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(e);try{return d(e)}catch(t){try{return d.call(null,e)}catch(t){return d.call(this,e)}}}function a(){m&&f&&(m=!1,f.length?y=f.concat(y):v=-1,y.length&&c())}function c(){if(!m){var e=i(a);m=!0;for(var t=y.length;t;){for(f=y,y=[];++v1)for(var r=1;r0&&u>c&&(u=c);for(var l=0;l=0?(p=y.substr(0,m),d=y.substr(m+1)):(p=y,d=""),h=decodeURIComponent(p),f=decodeURIComponent(d),o(s,h)?n(s[h])?s[h].push(f):s[h]=[s[h],f]:s[h]=f}return s};var n=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},{}],14:[function(e,t,r){"use strict";function o(e,t){if(e.map)return e.map(t);for(var r=[],o=0;o0)n.scope=r;else if("undefined"!=typeof r)throw new Error("the scope given to `copyIndex` was not an array with settings, synonyms or rules");return this._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(e)+"/operation",body:n,hostType:"write",callback:i})},o.prototype.getLogs=function(t,r,o){var n=e(26),i={};return"object"==typeof t?(i=n(t),o=r):0===arguments.length||"function"==typeof t?o=t:1===arguments.length||"function"==typeof r?(o=r,i.offset=t):(i.offset=t,i.length=r),void 0===i.offset&&(i.offset=0),void 0===i.length&&(i.length=10),this._jsonRequest({method:"GET",url:"/1/logs?"+this._getSearchParams(i,""),hostType:"read",callback:o})},o.prototype.listIndexes=function(e,t){var r="";return void 0===e||"function"==typeof e?t=e:r="?page="+e,this._jsonRequest({method:"GET",url:"/1/indexes"+r,hostType:"read",callback:t})},o.prototype.initIndex=function(e){return new i(this,e)},o.prototype.initAnalytics=function(t){var r=e(27);return r(this.applicationID,this.apiKey,t)},o.prototype.listUserKeys=s(function(e){return this.listApiKeys(e)},a("client.listUserKeys()","client.listApiKeys()")),o.prototype.listApiKeys=function(e){return this._jsonRequest({method:"GET",url:"/1/keys",hostType:"read",callback:e})},o.prototype.getUserKeyACL=s(function(e,t){return this.getApiKey(e,t)},a("client.getUserKeyACL()","client.getApiKey()")),o.prototype.getApiKey=function(e,t){return this._jsonRequest({method:"GET",url:"/1/keys/"+e,hostType:"read",callback:t})},o.prototype.deleteUserKey=s(function(e,t){return this.deleteApiKey(e,t)},a("client.deleteUserKey()","client.deleteApiKey()")),o.prototype.deleteApiKey=function(e,t){return this._jsonRequest({method:"DELETE",url:"/1/keys/"+e,hostType:"write",callback:t})},o.prototype.restoreApiKey=function(e,t){return this._jsonRequest({method:"POST",url:"/1/keys/"+e+"/restore",hostType:"write",callback:t})},o.prototype.addUserKey=s(function(e,t,r){return this.addApiKey(e,t,r)},a("client.addUserKey()","client.addApiKey()")),o.prototype.addApiKey=function(t,r,o){var n=e(8),i="Usage: client.addApiKey(arrayOfAcls[, params, callback])";if(!n(t))throw new Error(i);1!==arguments.length&&"function"!=typeof r||(o=r,r=null);var s={acl:t};return r&&(s.validity=r.validity,s.maxQueriesPerIPPerHour=r.maxQueriesPerIPPerHour,s.maxHitsPerQuery=r.maxHitsPerQuery,s.indexes=r.indexes,s.description=r.description,r.queryParameters&&(s.queryParameters=this._getSearchParams(r.queryParameters,"")),s.referers=r.referers),this._jsonRequest({method:"POST",url:"/1/keys",body:s,hostType:"write",callback:o})},o.prototype.addUserKeyWithValidity=s(function(e,t,r){return this.addApiKey(e,t,r)},a("client.addUserKeyWithValidity()","client.addApiKey()")),o.prototype.updateUserKey=s(function(e,t,r,o){return this.updateApiKey(e,t,r,o)},a("client.updateUserKey()","client.updateApiKey()")),o.prototype.updateApiKey=function(t,r,o,n){var i=e(8),s="Usage: client.updateApiKey(key, arrayOfAcls[, params, callback])";if(!i(r))throw new Error(s);2!==arguments.length&&"function"!=typeof o||(n=o,o=null);var a={acl:r};return o&&(a.validity=o.validity,a.maxQueriesPerIPPerHour=o.maxQueriesPerIPPerHour,a.maxHitsPerQuery=o.maxHitsPerQuery,a.indexes=o.indexes,a.description=o.description,o.queryParameters&&(a.queryParameters=this._getSearchParams(o.queryParameters,"")),a.referers=o.referers),this._jsonRequest({method:"PUT",url:"/1/keys/"+t,body:a,hostType:"write",callback:n})},o.prototype.startQueriesBatch=s(function(){this._batch=[]},a("client.startQueriesBatch()","client.search()")),o.prototype.addQueryInBatch=s(function(e,t,r){this._batch.push({indexName:e,query:t,params:r})},a("client.addQueryInBatch()","client.search()")),o.prototype.sendQueriesBatch=s(function(e){return this.search(this._batch,e)},a("client.sendQueriesBatch()","client.search()")),o.prototype.batch=function(t,r){var o=e(8),n="Usage: client.batch(operations[, callback])";if(!o(t))throw new Error(n);return this._jsonRequest({method:"POST",url:"/1/indexes/*/batch",body:{requests:t},hostType:"write",callback:r})},o.prototype.assignUserID=function(e,t){if(!e.userID||!e.cluster)throw new l.AlgoliaSearchError("You have to provide both a userID and cluster",e);return this._jsonRequest({method:"POST",url:"/1/clusters/mapping",hostType:"write",body:{cluster:e.cluster},callback:t,headers:{"x-algolia-user-id":e.userID}})},o.prototype.assignUserIDs=function(e,t){if(!e.userIDs||!e.cluster)throw new l.AlgoliaSearchError("You have to provide both an array of userIDs and cluster",e);return this._jsonRequest({method:"POST",url:"/1/clusters/mapping/batch",hostType:"write",body:{cluster:e.cluster,users:e.userIDs},callback:t})},o.prototype.getTopUserID=function(e){return this._jsonRequest({method:"GET",url:"/1/clusters/mapping/top",hostType:"read",callback:e})},o.prototype.getUserID=function(e,t){if(!e.userID)throw new l.AlgoliaSearchError("You have to provide a userID",{debugData:e});return this._jsonRequest({method:"GET",url:"/1/clusters/mapping/"+e.userID,hostType:"read",callback:t})},o.prototype.listClusters=function(e){return this._jsonRequest({method:"GET",url:"/1/clusters",hostType:"read",callback:e})},o.prototype.listUserIDs=function(e,t){return this._jsonRequest({method:"GET",url:"/1/clusters/mapping",body:e,hostType:"read",callback:t})},o.prototype.removeUserID=function(e,t){if(!e.userID)throw new l.AlgoliaSearchError("You have to provide a userID",{debugData:e});return this._jsonRequest({method:"DELETE",url:"/1/clusters/mapping",hostType:"write",callback:t,headers:{"x-algolia-user-id":e.userID}})},o.prototype.searchUserIDs=function(e,t){return this._jsonRequest({method:"POST",url:"/1/clusters/mapping/search",body:e,hostType:"read",callback:t})},o.prototype.setPersonalizationStrategy=function(e,t){return this._jsonRequest({method:"POST",url:"/1/recommendation/personalization/strategy",body:e,hostType:"write",callback:t})},o.prototype.getPersonalizationStrategy=function(e){return this._jsonRequest({method:"GET",url:"/1/recommendation/personalization/strategy",hostType:"read",callback:e})},o.prototype.destroy=n,o.prototype.enableRateLimitForward=n,o.prototype.disableRateLimitForward=n,o.prototype.useSecuredAPIKey=n,o.prototype.disableSecuredAPIKey=n,o.prototype.generateSecuredApiKey=n,o.prototype.getSecuredApiKeyRemainingValidity=n},{17:17,18:18,26:26,27:27,28:28,29:29,30:30,7:7,8:8}],17:[function(e,t,r){ +(function(r){function o(t,r,o){var i=e(1)("algoliasearch"),s=e(26),a=e(8),u=e(32),l="Usage: algoliasearch(applicationID, apiKey, opts)";if(o._allowEmptyCredentials!==!0&&!t)throw new c.AlgoliaSearchError("Please provide an application ID. "+l);if(o._allowEmptyCredentials!==!0&&!r)throw new c.AlgoliaSearchError("Please provide an API key. "+l);this.applicationID=t,this.apiKey=r,this.hosts={read:[],write:[]},o=o||{},this._timeouts=o.timeouts||{connect:1e3,read:2e3,write:3e4},o.timeout&&(this._timeouts.connect=this._timeouts.read=this._timeouts.write=o.timeout);var p=o.protocol||"https:";if(/:$/.test(p)||(p+=":"),"http:"!==p&&"https:"!==p)throw new c.AlgoliaSearchError("protocol must be `http:` or `https:` (was `"+o.protocol+"`)");if(this._checkAppIdData(),o.hosts)a(o.hosts)?(this.hosts.read=s(o.hosts),this.hosts.write=s(o.hosts)):(this.hosts.read=s(o.hosts.read),this.hosts.write=s(o.hosts.write));else{var d=u(this._shuffleResult,function(e){return t+"-"+e+".algolianet.com"}),h=(o.dsn===!1?"":"-dsn")+".algolia.net";this.hosts.read=[this.applicationID+h].concat(d),this.hosts.write=[this.applicationID+".algolia.net"].concat(d)}this.hosts.read=u(this.hosts.read,n(p)),this.hosts.write=u(this.hosts.write,n(p)),this.extraHeaders={},this.cache=o._cache||{},this._ua=o._ua,this._useCache=!(void 0!==o._useCache&&!o._cache)||o._useCache,this._useRequestCache=this._useCache&&o._useRequestCache,this._useFallback=void 0===o.useFallback||o.useFallback,this._setTimeout=o._setTimeout,i("init done, %j",this)}function n(e){return function(t){return e+"//"+t.toLowerCase()}}function i(e){if(void 0===Array.prototype.toJSON)return JSON.stringify(e);var t=Array.prototype.toJSON;delete Array.prototype.toJSON;var r=JSON.stringify(e);return Array.prototype.toJSON=t,r}function s(e){for(var t,r,o=e.length;0!==o;)r=Math.floor(Math.random()*o),o-=1,t=e[o],e[o]=e[r],e[r]=t;return e}function a(e){var t={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)){var o;o="x-algolia-api-key"===r||"x-algolia-application-id"===r?"**hidden for security purposes**":e[r],t[r]=o}return t}t.exports=o;var c=e(30),u=e(31),l=e(20),p=e(36),d=500,h=r.env.RESET_APP_DATA_TIMER&&parseInt(r.env.RESET_APP_DATA_TIMER,10)||12e4;o.prototype.initIndex=function(e){return new l(this,e)},o.prototype.setExtraHeader=function(e,t){this.extraHeaders[e.toLowerCase()]=t},o.prototype.getExtraHeader=function(e){return this.extraHeaders[e.toLowerCase()]},o.prototype.unsetExtraHeader=function(e){delete this.extraHeaders[e.toLowerCase()]},o.prototype.addAlgoliaAgent=function(e){var t="; "+e;this._ua.indexOf(t)===-1&&(this._ua+=t)},o.prototype._jsonRequest=function(t){function r(e,n){function u(e){var t=e&&e.body&&e.body.message&&e.body.status||e.statusCode||e&&e.body&&200;h("received response: statusCode: %s, computed statusCode: %d, headers: %j",e.statusCode,t,e.headers);var r=2===Math.floor(t/100),o=new Date;if(w.push({currentHost:A,headers:a(p),content:s||null,contentLength:void 0!==s?s.length:null,method:n.method,timeouts:n.timeouts,url:n.url,startTime:x,endTime:o,duration:o-x,statusCode:t}),r)return m._useCache&&!m._useRequestCache&&y&&(y[l]=e.responseText),{responseText:e.responseText,body:e.body};var i=4!==Math.floor(t/100);if(i)return v+=1,_();h("unrecoverable error");var u=new c.AlgoliaSearchError(e.body&&e.body.message,{debugData:w,statusCode:t});return m._promise.reject(u)}function d(e){h("error: %s, stack: %s",e.message,e.stack);var r=new Date;return w.push({currentHost:A,headers:a(p),content:s||null,contentLength:void 0!==s?s.length:null,method:n.method,timeouts:n.timeouts,url:n.url,startTime:x,endTime:r,duration:r-x}),e instanceof c.AlgoliaSearchError||(e=new c.Unknown(e&&e.message,e)),v+=1,e instanceof c.Unknown||e instanceof c.UnparsableJSON||v>=m.hosts[t.hostType].length&&(g||!b)?(e.debugData=w,m._promise.reject(e)):e instanceof c.RequestTimeout?T():_()}function _(){return h("retrying request"),m._incrementHostIndex(t.hostType),r(e,n)}function T(){return h("retrying request with higher timeout"),m._incrementHostIndex(t.hostType),m._incrementTimeoutMultipler(),n.timeouts=m._getTimeoutsForRequest(t.hostType),r(e,n)}m._checkAppIdData();var x=new Date;if(m._useCache&&!m._useRequestCache&&(l=t.url),m._useCache&&!m._useRequestCache&&s&&(l+="_body_"+n.body),o(!m._useRequestCache,y,l)){h("serving response from cache");var R=y[l];return m._promise.resolve({body:JSON.parse(R),responseText:R})}if(v>=m.hosts[t.hostType].length)return!b||g?(h("could not get any response"),m._promise.reject(new c.AlgoliaSearchError("Cannot connect to the AlgoliaSearch API. Send an email to support@algolia.com to report and resolve the issue. Application id was: "+m.applicationID,{debugData:w}))):(h("switching to fallback"),v=0,n.method=t.fallback.method,n.url=t.fallback.url,n.jsonBody=t.fallback.body,n.jsonBody&&(n.body=i(n.jsonBody)),p=m._computeRequestHeaders({additionalUA:f,headers:t.headers}),n.timeouts=m._getTimeoutsForRequest(t.hostType),m._setHostIndexByType(0,t.hostType),g=!0,r(m._request.fallback,n));var A=m._getHostByType(t.hostType),j=A+n.url,S={body:n.body,jsonBody:n.jsonBody,method:n.method,headers:p,timeouts:n.timeouts,debug:h,forceAuthHeaders:n.forceAuthHeaders};return h("method: %s, url: %s, headers: %j, timeouts: %d",S.method,j,S.headers,S.timeouts),e===m._request.fallback&&h("using fallback"),e.call(m,j,S).then(u,d)}function o(e,t,r){return m._useCache&&e&&t&&void 0!==t[r]}function n(e,r){return o(m._useRequestCache,y,l)&&e["catch"](function(){delete y[l]}),"function"!=typeof t.callback?e.then(r):void e.then(function(e){u(function(){t.callback(null,r(e))},m._setTimeout||setTimeout)},function(e){u(function(){t.callback(e)},m._setTimeout||setTimeout)})}this._checkAppIdData();var s,l,p,h=e(1)("algoliasearch:"+t.url),f=t.additionalUA||"",y=t.cache,m=this,v=0,g=!1,b=m._useFallback&&m._request.fallback&&t.fallback;this.apiKey.length>d&&void 0!==t.body&&(void 0!==t.body.params||void 0!==t.body.requests)?(t.body.apiKey=this.apiKey,p=this._computeRequestHeaders({additionalUA:f,withApiKey:!1,headers:t.headers})):p=this._computeRequestHeaders({additionalUA:f,headers:t.headers}),void 0!==t.body&&(s=i(t.body)),h("request start");var w=[];if(m._useCache&&m._useRequestCache&&(l=t.url),m._useCache&&m._useRequestCache&&s&&(l+="_body_"+s),o(m._useRequestCache,y,l)){h("serving request from cache");var _=y[l],T="function"!=typeof _.then?m._promise.resolve({responseText:_}):_;return n(T,function(e){return JSON.parse(e.responseText)})}var x=r(m._request,{url:t.url,method:t.method,body:s,jsonBody:t.body,timeouts:m._getTimeoutsForRequest(t.hostType),forceAuthHeaders:t.forceAuthHeaders});return m._useCache&&m._useRequestCache&&y&&(y[l]=x),n(x,function(e){return e.body})},o.prototype._getSearchParams=function(e,t){if(void 0===e||null===e)return t;for(var r in e)null!==r&&void 0!==e[r]&&e.hasOwnProperty(r)&&(t+=""===t?"":"&",t+=r+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(e[r])?i(e[r]):e[r]));return t},o.prototype._computeRequestHeaders=function(t){var r=e(5),o=t.additionalUA?this._ua+"; "+t.additionalUA:this._ua,n={"x-algolia-agent":o,"x-algolia-application-id":this.applicationID};return t.withApiKey!==!1&&(n["x-algolia-api-key"]=this.apiKey),this.userToken&&(n["x-algolia-usertoken"]=this.userToken),this.securityTags&&(n["x-algolia-tagfilters"]=this.securityTags),r(this.extraHeaders,function(e,t){n[t]=e}),t.headers&&r(t.headers,function(e,t){n[t]=e}),n},o.prototype.search=function(t,r,o){var n=e(8),i=e(32),s="Usage: client.search(arrayOfQueries[, callback])";if(!n(t))throw new Error(s);"function"==typeof r?(o=r,r={}):void 0===r&&(r={});var a=this,c={requests:i(t,function(e){var t="";return void 0!==e.query&&(t+="query="+encodeURIComponent(e.query)),{indexName:e.indexName,params:a._getSearchParams(e.params,t)}})},u=i(c.requests,function(e,t){return t+"="+encodeURIComponent("/1/indexes/"+encodeURIComponent(e.indexName)+"?"+e.params)}).join("&"),l="/1/indexes/*/queries";return void 0!==r.strategy&&(c.strategy=r.strategy),this._jsonRequest({cache:this.cache,method:"POST",url:l,body:c,hostType:"read",fallback:{method:"GET",url:"/1/indexes/*",body:{params:u}},callback:o})},o.prototype.searchForFacetValues=function(t){var r=e(8),o=e(32),n="Usage: client.searchForFacetValues([{indexName, params: {facetName, facetQuery, ...params}}, ...queries])";if(!r(t))throw new Error(n);var i=this;return i._promise.all(o(t,function(t){if(!t||void 0===t.indexName||void 0===t.params.facetName||void 0===t.params.facetQuery)throw new Error(n);var r=e(26),o=e(34),s=t.indexName,a=t.params,c=a.facetName,u=o(r(a),function(e){return"facetName"===e}),l=i._getSearchParams(u,"");return i._jsonRequest({cache:i.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(s)+"/facets/"+encodeURIComponent(c)+"/query",hostType:"read",body:{params:l}})}))},o.prototype.setSecurityTags=function(e){if("[object Array]"===Object.prototype.toString.call(e)){for(var t=[],r=0;rh?this._resetInitialAppIdData(e):e},o.prototype._resetInitialAppIdData=function(e){var t=e||{};return t.hostIndexes={read:0,write:0},t.timeoutMultiplier=1,t.shuffleResult=t.shuffleResult||s([1,2,3]),this._setAppIdData(t)},o.prototype._cacheAppIdData=function(e){this._hostIndexes=e.hostIndexes,this._timeoutMultiplier=e.timeoutMultiplier,this._shuffleResult=e.shuffleResult},o.prototype._partialAppIdDataUpdate=function(t){var r=e(5),o=this._getAppIdData();return r(t,function(e,t){o[t]=e}),this._setAppIdData(o)},o.prototype._getHostByType=function(e){return this.hosts[e][this._getHostIndexByType(e)]},o.prototype._getTimeoutMultiplier=function(){return this._timeoutMultiplier},o.prototype._getHostIndexByType=function(e){return this._hostIndexes[e]},o.prototype._setHostIndexByType=function(t,r){var o=e(26),n=o(this._hostIndexes);return n[r]=t,this._partialAppIdDataUpdate({hostIndexes:n}),t},o.prototype._incrementHostIndex=function(e){return this._setHostIndexByType((this._getHostIndexByType(e)+1)%this.hosts[e].length,e)},o.prototype._incrementTimeoutMultipler=function(){var e=Math.max(this._timeoutMultiplier+1,4);return this._partialAppIdDataUpdate({timeoutMultiplier:e})},o.prototype._getTimeoutsForRequest=function(e){return{connect:this._timeouts.connect*this._timeoutMultiplier,complete:this._timeouts[e]*this._timeoutMultiplier}}}).call(this,e(12))},{1:1,12:12,20:20,26:26,30:30,31:31,32:32,34:34,36:36,5:5,8:8}],18:[function(e,t,r){function o(){s.apply(this,arguments)}function n(e,t,r){function o(r,n){var i={page:r||0,hitsPerPage:t||100},s=n||[];return e(i).then(function(e){var t=e.hits,r=e.nbHits,n=t.map(function(e){return delete e._highlightResult,e}),a=s.concat(n);return a.lengths&&(t=s),"published"!==e.status?l._promise.delay(t).then(r):e})}function o(e){u(function(){t(null,e)},l._setTimeout||setTimeout)}function n(e){u(function(){t(e)},l._setTimeout||setTimeout)}var i=100,s=5e3,a=0,c=this,l=c.as,p=r();return t?void p.then(o,n):p},o.prototype.clearIndex=function(e){var t=this;return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(t.indexName)+"/clear",hostType:"write",callback:e})},o.prototype.getSettings=function(e,t){1===arguments.length&&"function"==typeof e&&(t=e,e={}),e=e||{};var r=encodeURIComponent(this.indexName);return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+r+"/settings?getVersion=2"+(e.advanced?"&advanced="+e.advanced:""),hostType:"read",callback:t})},o.prototype.searchSynonyms=function(e,t){return"function"==typeof e?(t=e,e={}):void 0===e&&(e={}),this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/search",body:e,hostType:"read",callback:t})},o.prototype.exportSynonyms=function(e,t){return n(this.searchSynonyms.bind(this),e,t)},o.prototype.saveSynonym=function(e,t,r){"function"==typeof t?(r=t,t={}):void 0===t&&(t={}),void 0!==t.forwardToSlaves&&p();var o=t.forwardToSlaves||t.forwardToReplicas?"true":"false";return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/"+encodeURIComponent(e.objectID)+"?forwardToReplicas="+o,body:e,hostType:"write",callback:r})},o.prototype.getSynonym=function(e,t){return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/"+encodeURIComponent(e),hostType:"read",callback:t})},o.prototype.deleteSynonym=function(e,t,r){"function"==typeof t?(r=t,t={}):void 0===t&&(t={}),void 0!==t.forwardToSlaves&&p();var o=t.forwardToSlaves||t.forwardToReplicas?"true":"false";return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/"+encodeURIComponent(e)+"?forwardToReplicas="+o,hostType:"write",callback:r})},o.prototype.clearSynonyms=function(e,t){"function"==typeof e?(t=e,e={}):void 0===e&&(e={}),void 0!==e.forwardToSlaves&&p();var r=e.forwardToSlaves||e.forwardToReplicas?"true":"false";return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/clear?forwardToReplicas="+r,hostType:"write",callback:t})},o.prototype.batchSynonyms=function(e,t,r){"function"==typeof t?(r=t,t={}):void 0===t&&(t={}),void 0!==t.forwardToSlaves&&p();var o=t.forwardToSlaves||t.forwardToReplicas?"true":"false";return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/synonyms/batch?forwardToReplicas="+o+"&replaceExistingSynonyms="+(t.replaceExistingSynonyms?"true":"false"),hostType:"write",body:e,callback:r})},o.prototype.searchRules=function(e,t){return"function"==typeof e?(t=e,e={}):void 0===e&&(e={}),this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/search",body:e,hostType:"read",callback:t})},o.prototype.exportRules=function(e,t){return n(this.searchRules.bind(this),e,t)},o.prototype.saveRule=function(e,t,r){if("function"==typeof t?(r=t,t={}):void 0===t&&(t={}),!e.objectID)throw new l.AlgoliaSearchError("Missing or empty objectID field for rule");var o=t.forwardToReplicas===!0?"true":"false";return this.as._jsonRequest({method:"PUT",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/"+encodeURIComponent(e.objectID)+"?forwardToReplicas="+o,body:e,hostType:"write",callback:r})},o.prototype.getRule=function(e,t){return this.as._jsonRequest({method:"GET",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/"+encodeURIComponent(e),hostType:"read",callback:t})},o.prototype.deleteRule=function(e,t,r){"function"==typeof t?(r=t,t={}):void 0===t&&(t={});var o=t.forwardToReplicas===!0?"true":"false";return this.as._jsonRequest({method:"DELETE",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/"+encodeURIComponent(e)+"?forwardToReplicas="+o,hostType:"write",callback:r})},o.prototype.clearRules=function(e,t){"function"==typeof e?(t=e,e={}):void 0===e&&(e={});var r=e.forwardToReplicas===!0?"true":"false";return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/clear?forwardToReplicas="+r,hostType:"write",callback:t})},o.prototype.batchRules=function(e,t,r){"function"==typeof t?(r=t,t={}):void 0===t&&(t={});var o=t.forwardToReplicas===!0?"true":"false";return this.as._jsonRequest({method:"POST",url:"/1/indexes/"+encodeURIComponent(this.indexName)+"/rules/batch?forwardToReplicas="+o+"&clearExistingRules="+(t.clearExistingRules===!0?"true":"false"),hostType:"write",body:e,callback:r})},o.prototype.exists=function(e){var t=this.getSettings().then(function(){return!0})["catch"](function(e){if(e instanceof l.AlgoliaSearchError&&404===e.statusCode)return!1;throw e});return"function"!=typeof e?t:void t.then(function(t){e(null,t)})["catch"](function(t){e(t)})},o.prototype.findObject=function(e,t,r){t=void 0===t?{}:t;var o=void 0===t.paginate||t.paginate,n=void 0!==t.query?t.query:"",i=this,s=0,a=function(){return t.page=s,i.search(n,t).then(function(t){for(var r=t.hits,n=0;n=t.nbPages)throw new l.ObjectNotFound("Object not found");return a()})},c=a(s);return void 0===r?c:void c.then(function(e){r(null,e)})["catch"](function(e){r(e)})},o.prototype.getObjectPosition=function(e,t){for(var r=e.hits,o=0;o1&&a()}if(!h.cors&&!h.hasXDomainRequest)return void o(new u.Network("CORS not supported"));e=l(e,t.headers);var d,f,y=t.body,m=h.cors?new XMLHttpRequest:new XDomainRequest,v=!1;d=setTimeout(s,t.timeouts.connect),m.onprogress=c,"onreadystatechange"in m&&(m.onreadystatechange=p),m.onload=n,m.onerror=i,m instanceof XMLHttpRequest?(m.open(t.method,e,!0),t.forceAuthHeaders&&(m.setRequestHeader("x-algolia-application-id",t.headers["x-algolia-application-id"]),m.setRequestHeader("x-algolia-api-key",t.headers["x-algolia-api-key"]))):m.open(t.method,e),h.cors&&(y&&("POST"===t.method?m.setRequestHeader("content-type","application/x-www-form-urlencoded"):m.setRequestHeader("content-type","application/json")),m.setRequestHeader("accept","application/json")),y?m.send(y):m.send()})},a.prototype._request.fallback=function(e,t){return e=l(e,t.headers),new n(function(r,o){p(e,t,function(e,t){return e?void o(e):void r(t)})})},a.prototype._promise={reject:function(e){return n.reject(e)},resolve:function(e){return n.resolve(e)},delay:function(e){return new n(function(t){setTimeout(t,e)})},all:function(e){return n.all(e)}},s}}).call(this,e(12))},{1:1,12:12,23:23,24:24,26:26,3:3,30:30,35:35,37:37,6:6,7:7}],23:[function(e,t,r){"use strict";function o(e,t){return e+=/\?/.test(e)?"&":"?",e+n(t)}t.exports=o;var n=e(14)},{14:14}],24:[function(e,t,r){"use strict";function o(e,t,r){function o(){t.debug("JSONP: success"),m||d||(m=!0,p||(t.debug("JSONP: Fail. Script loaded but did not call the callback"), +a(),r(new n.JSONPScriptFail)))}function s(){"loaded"!==this.readyState&&"complete"!==this.readyState||o()}function a(){clearTimeout(v),f.onload=null,f.onreadystatechange=null,f.onerror=null,h.removeChild(f)}function c(){try{delete window[y],delete window[y+"_loaded"]}catch(e){window[y]=window[y+"_loaded"]=void 0}}function u(){t.debug("JSONP: Script timeout"),d=!0,a(),r(new n.RequestTimeout)}function l(){t.debug("JSONP: Script error"),m||d||(a(),r(new n.JSONPScriptError))}if("GET"!==t.method)return void r(new Error("Method "+t.method+" "+e+" is not supported by JSONP."));t.debug("JSONP: start");var p=!1,d=!1;i+=1;var h=document.getElementsByTagName("head")[0],f=document.createElement("script"),y="algoliaJSONP_"+i,m=!1;window[y]=function(e){return c(),d?void t.debug("JSONP: Late answer, ignoring"):(p=!0,a(),void r(null,{body:e,responseText:JSON.stringify(e)}))},e+="&callback="+y,t.jsonBody&&t.jsonBody.params&&(e+="&"+t.jsonBody.params);var v=setTimeout(u,t.timeouts.complete);f.onreadystatechange=s,f.onload=o,f.onerror=l,f.async=!0,f.defer=!0,f.src=e,h.appendChild(f)}t.exports=o;var n=e(30),i=0},{30:30}],25:[function(e,t,r){function o(e,t){return function(r,o,i){if("function"==typeof r&&"object"==typeof o||"object"==typeof i)throw new n.AlgoliaSearchError("index.search usage is index.search(query, params, cb)");0===arguments.length||"function"==typeof r?(i=r,r=""):1!==arguments.length&&"function"!=typeof o||(i=o,o=void 0),"object"==typeof r&&null!==r?(o=r,r=void 0):void 0!==r&&null!==r||(r="");var s="";void 0!==r&&(s+=e+"="+encodeURIComponent(r));var a;return void 0!==o&&(o.additionalUA&&(a=o.additionalUA,delete o.additionalUA),s=this.as._getSearchParams(o,s)),this._search(s,t,i,a)}}t.exports=o;var n=e(30)},{30:30}],26:[function(e,t,r){t.exports=function(e){return JSON.parse(JSON.stringify(e))}},{}],27:[function(e,t,r){function o(e,t,r){var o={};return r=r||{},r.hosts=r.hosts||["analytics.algolia.com","analytics.algolia.com","analytics.algolia.com","analytics.algolia.com"],r.protocol=r.protocol||"https:",o.as=n(e,t,r),o.getABTests=function(e,t){var r=r||{},o=r.offset||0,n=r.limit||10;return this.as._jsonRequest({method:"GET",url:"/2/abtests?offset="+encodeURIComponent(o)+"&limit="+encodeURIComponent(n),hostType:"read",forceAuthHeaders:!0,callback:t})},o.getABTest=function(e,t){return this.as._jsonRequest({method:"GET",url:"/2/abtests/"+encodeURIComponent(e),hostType:"read",forceAuthHeaders:!0,callback:t})},o.addABTest=function(e,t){return this.as._jsonRequest({method:"POST",url:"/2/abtests",body:e,hostType:"read",forceAuthHeaders:!0,callback:t})},o.stopABTest=function(e,t){return this.as._jsonRequest({method:"POST",url:"/2/abtests/"+encodeURIComponent(e)+"/stop",hostType:"read",forceAuthHeaders:!0,callback:t})},o.deleteABTest=function(e,t){return this.as._jsonRequest({method:"DELETE",url:"/2/abtests/"+encodeURIComponent(e),hostType:"write",forceAuthHeaders:!0,callback:t})},o.waitTask=function(e,t,r){return this.as.initIndex(e).waitTask(t,r)},o}t.exports=o;var n=e(21)},{21:21}],28:[function(e,t,r){t.exports=function(e,t){function r(){return o||(console.warn(t),o=!0),e.apply(this,arguments)}var o=!1;return r}},{}],29:[function(e,t,r){t.exports=function(e,t){var r=e.toLowerCase().replace(/[\.\(\)]/g,"");return"algoliasearch: `"+e+"` was replaced by `"+t+"`. Please see https://github.com/algolia/algoliasearch-client-javascript/wiki/Deprecated#"+r}},{}],30:[function(e,t,r){"use strict";function o(t,r){var o=e(5),n=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):n.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=t||"Unknown error",r&&o(r,function(e,t){n[t]=e})}function n(e,t){function r(){var r=Array.prototype.slice.call(arguments,0);"string"!=typeof r[0]&&r.unshift(t),o.apply(this,r),this.name="AlgoliaSearch"+e+"Error"}return i(r,o),r}var i=e(7);i(o,Error),t.exports={AlgoliaSearchError:o,UnparsableJSON:n("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:n("RequestTimeout","Request timed out before getting a response"),Network:n("Network","Network issue, see err.more for details"),JSONPScriptFail:n("JSONPScriptFail"," + + + + + + \ No newline at end of file diff --git a/filters/append.html b/filters/append.html new file mode 100644 index 000000000..d6cb29f6d --- /dev/null +++ b/filters/append.html @@ -0,0 +1,191 @@ + + + + + append | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

append

+ + + +
+
+

Added in: v1.9.1

+ +

Concatenates two strings and returns the concatenated value.

+

Input

+
{{ "/my/fancy/url" | append: ".html" }}
+ +

Output

+
/my/fancy/url.html
+ +

append can also be used with variables:

+

Input

+
{% assign filename = "/index.html" %}
{{ "website.com" | append: filename }}
+ +

Output

+

website.com/index.html
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/at_least.html b/filters/at_least.html new file mode 100644 index 000000000..0be2541ec --- /dev/null +++ b/filters/at_least.html @@ -0,0 +1,190 @@ + + + + + at_least | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

at_least

+ + + +
+
+

Added in: v8.4.0

+ +

Limits a number to a minimum value.

+

Input

+
{{ 4 | at_least: 5 }}
+ +

Output

+
5
+ +

Input

+
{{ 4 | at_least: 3 }}
+ +

Output

+
4
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/at_most.html b/filters/at_most.html new file mode 100644 index 000000000..90c91e342 --- /dev/null +++ b/filters/at_most.html @@ -0,0 +1,190 @@ + + + + + at_most | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

at_most

+ + + +
+
+

Added in: v8.4.0

+ +

Limits a number to a maximum value.

+

Input

+
{{ 4 | at_most: 5 }}
+ +

Output

+
4
+ +

Input

+
{{ 4 | at_most: 3 }}
+ +

Output

+
3
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/capitalize.html b/filters/capitalize.html new file mode 100644 index 000000000..0fe4c674a --- /dev/null +++ b/filters/capitalize.html @@ -0,0 +1,191 @@ + + + + + capitalize | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

capitalize

+ + + +
+
+

Added in: v1.9.1

+ +

Makes the first character of a string capitalized.

+

Input

+
{{ "title" | capitalize }}
+ +

Output

+
Title
+ +

capitalize only capitalizes the first character of a string, so later words are not affected:

+

Input

+
{{ "my great title" | capitalize }}
+ +

Output

+
My great title
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/ceil.html b/filters/ceil.html new file mode 100644 index 000000000..11161b1de --- /dev/null +++ b/filters/ceil.html @@ -0,0 +1,203 @@ + + + + + ceil | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

ceil

+ + + +
+
+

Added in: v1.9.1

+ +

Rounds the input up to the nearest whole number. LiquidJS tries to convert the input to a number before the filter is applied.

+

Input

+
{{ 1.2 | ceil }}
+ +

Output

+
2
+ +

Input

+
{{ 2.0 | ceil }}
+ +

Output

+
2
+ +

Input

+
{{ 183.357 | ceil }}
+ +

Output

+
184
+ +

Here the input value is a string:

+

Input

+
{{ "3.5" | ceil }}
+ +

Output

+
4
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/compact.html b/filters/compact.html new file mode 100644 index 000000000..3856b4c33 --- /dev/null +++ b/filters/compact.html @@ -0,0 +1,192 @@ + + + + + compact | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

compact

+ + + +
+
+

Added in: v9.22.0

+ +

Removes any nil values from an array.

+

For this example, assume site.pages is an array of content pages for a website, and some of these pages have an attribute called category that specifies their content category. If we map those categories to an array, some of the array items might be nil if any pages do not have a category attribute.

+

Input

+
{% assign site_categories = site.pages | map: "category" %}

{% for category in site_categories %}
- {{ category }}
{% endfor %}
+ +

Output

+
- business
- celebrities
-
- lifestyle
- sports
-
- technology
+ +

By using compact when we create our site_categories array, we can remove all the nil values in the array.

+

Input

+
{% assign site_categories = site.pages | map: "category" | compact %}

{% for category in site_categories %}
- {{ category }}
{% endfor %}
+ +

Output

+
- business
- celebrities
- lifestyle
- sports
- technology
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/concat.html b/filters/concat.html new file mode 100644 index 000000000..e09d0c235 --- /dev/null +++ b/filters/concat.html @@ -0,0 +1,189 @@ + + + + + concat | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

concat

+ + + +
+
+

Concatenates (joins together) multiple arrays. The resulting array contains all the items from the input arrays.

+

Input

+
{% assign fruits = "apples, oranges, peaches" | split: ", " %}
{% assign vegetables = "carrots, turnips, potatoes" | split: ", " %}

{% assign everything = fruits | concat: vegetables %}

{% for item in everything %}
- {{ item }}
{% endfor %}
+ +

Output

+
- apples
- oranges
- peaches
- carrots
- turnips
- potatoes
+ +

You can string together concat filters to join more than two arrays:

+

Input

+
{% assign furniture = "chairs, tables, shelves" | split: ", " %}

{% assign everything = fruits | concat: vegetables | concat: furniture %}

{% for item in everything %}
- {{ item }}
{% endfor %}
+ +

Output

+
- apples
- oranges
- peaches
- carrots
- turnips
- potatoes
- chairs
- tables
- shelves
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/date.html b/filters/date.html new file mode 100644 index 000000000..362bbaa2c --- /dev/null +++ b/filters/date.html @@ -0,0 +1,208 @@ + + + + + date | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

date

+ + + +
+
+

Added in: v1.9.1

+ +

Converts a timestamp into another date format. LiquidJS tries to be conformant with Shopify/Liquid which is using Ruby’s core Time#strftime(string). The input is firstly converted to Date object via new Date().

+

Input

+
{{ article.published_at | date: "%a, %b %d, %y" }}
+ +

Output

+
Fri, Jul 17, 15
+ +

Input

+
{{ article.published_at | date: "%Y" }}
+ +

Output

+
2015
+ +

date works on strings if they contain well-formatted dates:

+

Input

+
{{ "March 14, 2016" | date: "%b %d, %y" }}
+ +

Output

+
Mar 14, 16
+ +

To get the current time, pass the special word "now" (or "today") to date:

+

Input

+
This page was last updated at {{ "now" | date: "%Y-%m-%d %H:%M" }}.
+ +

Output

+
This page was last updated at 2020-03-25 15:57.
+ +
now

Note that the value will be the current time of when the page was last generated from the template, not when the page is presented to a user if caching or static site generation is involved.

+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/default.html b/filters/default.html new file mode 100644 index 000000000..be4344f62 --- /dev/null +++ b/filters/default.html @@ -0,0 +1,200 @@ + + + + + default | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

default

+ + + +
+
+

Added in: v1.9.1

+ +

Allows you to specify a fallback in case a value doesn’t exist. default will show its value if the left side is falsy or empty (string or Array).

+

In this example, product_price is not defined, so the default value is used.

+

Input

+
{{ product_price | default: 2.99 }}
+ +

Output

+
2.99
+ +

In this example, product_price is defined, so the default value is not used.

+

Input

+
{% assign product_price = 4.99 %}
{{ product_price | default: 2.99 }}
+ +

Output

+
4.99
+ +

In this example, product_price is empty, so the default value is used.

+

Input

+
{% assign product_price = "" %}
{{ product_price | default: 2.99 }}
+ +

Output

+
2.99
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/divided_by.html b/filters/divided_by.html new file mode 100644 index 000000000..ca30d02bd --- /dev/null +++ b/filters/divided_by.html @@ -0,0 +1,194 @@ + + + + + divided_by | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

divided_by

+ + + +
+
+

Added in: v1.9.1

+ +

Divides a number by another number. The result is the string obtained by JavaScript .toString() of the result number.

+

Input

+
{{ 16 | divided_by: 4 }}
+ +

Output

+
4
+ +

Input

+
{{ 5 | divided_by: 3 }}
+ +

Output

+
1.6666666666666667
+ +
Integer Arithmetic

Since JavaScript doesn’t differentiate integers and floats, LiquidJS is not capable of integer arithmetic and the return type is always number, the string representation of which depends on its value.

+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/downcase.html b/filters/downcase.html new file mode 100644 index 000000000..e10092952 --- /dev/null +++ b/filters/downcase.html @@ -0,0 +1,190 @@ + + + + + downcase | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

downcase

+ + + +
+
+

Added in: v1.9.1

+ +

Makes each character in a string lowercase. It has no effect on strings which are already all lowercase.

+

Input

+
{{ "Parker Moore" | downcase }}
+ +

Output

+
parker moore
+ +

Input

+
{{ "apple" | downcase }}
+ +

Output

+
apple
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/escape.html b/filters/escape.html new file mode 100644 index 000000000..03e2f418f --- /dev/null +++ b/filters/escape.html @@ -0,0 +1,192 @@ + + + + + escape | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

escape

+ + + +
+
+

Added in: v1.9.1

+ +

Escapes a string by replacing HTML special characters with escape sequences. It doesn’t change strings that don’t have anything to escape.

+

Input

+
{{ "Have you read 'James & the Giant Peach'?" | escape }}
+ +

Output

+
+Have you read &#39;James &amp; the Giant Peach&#39;?
+
+ +

Input

+
{{ "Tetsuro Takara" | escape }}
+ +

Output

+
Tetsuro Takara
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/escape_once.html b/filters/escape_once.html new file mode 100644 index 000000000..4ad7203f7 --- /dev/null +++ b/filters/escape_once.html @@ -0,0 +1,196 @@ + + + + + escape_once | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

escape_once

+ + + +
+
+

Added in: v1.9.1

+ +

Escapes a string without changing existing escaped entities. It doesn’t change strings that don’t have anything to escape.

+

Input

+
{{ "1 < 2 & 3" | escape_once }}
+ +

Output

+
+1 &lt; 2 &amp; 3
+
+ +

Input

+
+{{ "1 &lt; 2 &amp; 3" | escape_once }}
+
+ +

Output

+
+1 &lt; 2 &amp; 3
+
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/first.html b/filters/first.html new file mode 100644 index 000000000..94249a97b --- /dev/null +++ b/filters/first.html @@ -0,0 +1,193 @@ + + + + + first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

first

+ + + +
+
+

Added in: v1.9.1

+ +

Returns the first item of an array.

+

Input

+
{{ "Ground control to Major Tom." | split: " " | first }}
+ +

Output

+
Ground
+ +

Input

+
{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}
{{ my_array.first }}
+ +

Output

+

zebra
+ +

You can use first with dot notation when you need to use the filter inside a tag:

+
{% if my_array.first == "zebra" %}
Here comes a zebra!
{% endif %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/floor.html b/filters/floor.html new file mode 100644 index 000000000..07275d039 --- /dev/null +++ b/filters/floor.html @@ -0,0 +1,203 @@ + + + + + floor | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

floor

+ + + +
+
+

Added in: v1.9.1

+ +

Rounds the input down to the nearest whole number. LiquidJS tries to convert the input to a number before the filter is applied.

+

Input

+
{{ 1.2 | floor }}
+ +

Output

+
1
+ +

Input

+
{{ 2.0 | floor }}
+ +

Output

+
2
+ +

Input

+
{{ 183.357 | floor }}
+ +

Output

+
183
+ +

Here the input value is a string:

+

Input

+
{{ "3.5" | floor }}
+ +

Output

+
3
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/join.html b/filters/join.html new file mode 100644 index 000000000..5c506c694 --- /dev/null +++ b/filters/join.html @@ -0,0 +1,184 @@ + + + + + join | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

join

+ + + +
+
+

Added in: v1.9.1

+ +

Combines the items in an array into a single string using the argument as a separator.

+

Input

+
{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}
{{ beatles | join: " and " }}
+ +

Output

+

John and Paul and George and Ringo
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/json.html b/filters/json.html new file mode 100644 index 000000000..7900a7821 --- /dev/null +++ b/filters/json.html @@ -0,0 +1,184 @@ + + + + + json | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

json

+ + + +
+
+

Added in: v9.10.0

+ +

Convert values to string via JSON.stringify(), for debug purpose.

+

Input

+
{% assign arr = "foo bar coo" | split: " " %}
{{ arr | json }}
+ +

Output

+
["foo","bar","coo"]
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/last.html b/filters/last.html new file mode 100644 index 000000000..5747f11a8 --- /dev/null +++ b/filters/last.html @@ -0,0 +1,193 @@ + + + + + last | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

last

+ + + +
+
+

Added in: v1.9.1

+ +

Returns the last item of an array.

+

Input

+
{{ "Ground control to Major Tom." | split: " " | last }}
+ +

Output

+
Tom.
+ +

Input

+
{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}
{{ my_array.last }}
+ +

Output

+

tiger
+ +

You can use last with dot notation when you need to use the filter inside a tag:

+
{% if my_array.last == "tiger" %}
There goes a tiger!
{% endif %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/lstrip.html b/filters/lstrip.html new file mode 100644 index 000000000..8c1dfba4f --- /dev/null +++ b/filters/lstrip.html @@ -0,0 +1,184 @@ + + + + + lstrip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

lstrip

+ + + +
+
+

Added in: v1.9.1

+ +

Removes all whitespace (tabs, spaces, and newlines) from the left side of a string. It does not affect spaces between words.

+

Input

+
BEGIN{{ "          So much room for activities!          " | lstrip }}END
+ +

Output

+
BEGINSo much room for activities!          END
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/map.html b/filters/map.html new file mode 100644 index 000000000..28e8dee83 --- /dev/null +++ b/filters/map.html @@ -0,0 +1,185 @@ + + + + + map | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

map

+ + + +
+
+

Added in: v1.9.1

+ +

Creates an array of values by extracting the values of a named property from another object.

+

In this example, assume the object site.pages contains all the metadata for a website. Using assign with the map filter creates a variable that contains only the values of the category properties of everything in the site.pages object.

+

Input

+
{% assign all_categories = site.pages | map: "category" %}

{% for item in all_categories %}
- {{ item }}
{% endfor %}
+ +

Output

+
- business
- celebrities
- lifestyle
- sports
- technology
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/minus.html b/filters/minus.html new file mode 100644 index 000000000..b8c450099 --- /dev/null +++ b/filters/minus.html @@ -0,0 +1,196 @@ + + + + + minus | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

minus

+ + + +
+
+

Added in: v1.9.1

+ +

Subtracts a number from another number.

+

Input

+
{{ 4 | minus: 2 }}
+ +

Output

+
2
+ +

Input

+
{{ 16 | minus: 4 }}
+ +

Output

+
12
+ +

Input

+
{{ 183.357 | minus: 12 }}
+ +

Output

+
171.357
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/modulo.html b/filters/modulo.html new file mode 100644 index 000000000..c6028e6ec --- /dev/null +++ b/filters/modulo.html @@ -0,0 +1,196 @@ + + + + + modulo | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

modulo

+ + + +
+
+

Added in: v1.9.1

+ +

Returns the remainder of a division operation.

+

Input

+
{{ 3 | modulo: 2 }}
+ +

Output

+
1
+ +

Input

+
{{ 24 | modulo: 7 }}
+ +

Output

+
3
+ +

Input

+
{{ 183.357 | modulo: 12 }}
+ +

Output

+
3.3569999999999993
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/newline_to_br.html b/filters/newline_to_br.html new file mode 100644 index 000000000..9c0f883fd --- /dev/null +++ b/filters/newline_to_br.html @@ -0,0 +1,184 @@ + + + + + newline_to_br | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

newline_to_br

+ + + +
+
+

Added in: v1.9.1

+ +

Replaces every newline (\n) in a string with an HTML line break (<br />).

+

Input

+
{% capture string_with_newlines %}
Hello
there
{% endcapture %}

{{ string_with_newlines | newline_to_br }}
+ +

Output

+

<br/>Hello<br/>there<br/>
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/overview.html b/filters/overview.html new file mode 100644 index 000000000..68cf405fc --- /dev/null +++ b/filters/overview.html @@ -0,0 +1,206 @@ + + + + + Filters | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Filters

+ + + +
+
+

LiquidJS implements business-logic independent filters that are typically implemented in shopify/liquid. This section contains the specification and demoes for all the filters implemented by LiquidJS.

+

There’s 40+ filters supported by LiquidJS. These filters can be categorized into these groups:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoriesFilters
Mathplus, minus, modulo, times, floor, ceil, round, divided_by, abs
Stringappend, prepend, capitalize, upcase, downcase, strip, lstrip, rstrip, strip_newlines, split, replace, replace_first, remove, remove_first, truncate, truncatewords
HTML/URIescape, escape_once, url_encode, url_decode, strip_html, newline_to_br
Arrayslice, map, sort, sort_natural, uniq, where, first, last, join, reverse
Datedate
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/plus.html b/filters/plus.html new file mode 100644 index 000000000..d28afe0e0 --- /dev/null +++ b/filters/plus.html @@ -0,0 +1,196 @@ + + + + + plus | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

plus

+ + + +
+
+

Added in: v1.9.1

+ +

Adds a number to another number.

+

Input

+
{{ 4 | plus: 2 }}
+ +

Output

+
6
+ +

Input

+
{{ 16 | plus: 4 }}
+ +

Output

+
20
+ +

Input

+
{{ 183.357 | plus: 12 }}
+ +

Output

+
195.357
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/prepend.html b/filters/prepend.html new file mode 100644 index 000000000..03705eb06 --- /dev/null +++ b/filters/prepend.html @@ -0,0 +1,191 @@ + + + + + prepend | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

prepend

+ + + +
+
+

Added in: v1.9.1

+ +

Adds the specified string to the beginning of another string.

+

Input

+
{{ "apples, oranges, and bananas" | prepend: "Some fruit: " }}
+ +

Output

+
Some fruit: apples, oranges, and bananas
+ +

prepend can also be used with variables:

+

Input

+
{% assign url = "example.com" %}
{{ "/index.html" | prepend: url }}
+ +

Output

+

example.com/index.html
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/remove.html b/filters/remove.html new file mode 100644 index 000000000..56f7c7960 --- /dev/null +++ b/filters/remove.html @@ -0,0 +1,184 @@ + + + + + remove | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

remove

+ + + +
+
+

Added in: v1.9.1

+ +

Removes every occurrence of the specified substring from a string.

+

Input

+
{{ "I strained to see the train through the rain" | remove: "rain" }}
+ +

Output

+
I strained to see the t through the
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/remove_first.html b/filters/remove_first.html new file mode 100644 index 000000000..808cc1d52 --- /dev/null +++ b/filters/remove_first.html @@ -0,0 +1,184 @@ + + + + + remove_first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

remove_first

+ + + +
+
+

Added in: v1.9.1

+ +

Removes only the first occurrence of the specified substring from a string.

+

Input

+
{{ "I strained to see the train through the rain" | remove_first: "rain" }}
+ +

Output

+
I strained to see the t through the rain
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/replace.html b/filters/replace.html new file mode 100644 index 000000000..065875079 --- /dev/null +++ b/filters/replace.html @@ -0,0 +1,184 @@ + + + + + replace | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

replace

+ + + +
+
+

Added in: v1.9.1

+ +

Replaces every occurrence of the first argument in a string with the second argument.

+

Input

+
{{ "Take my protein pills and put my helmet on" | replace: "my", "your" }}
+ +

Output

+
Take your protein pills and put your helmet on
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/replace_first.html b/filters/replace_first.html new file mode 100644 index 000000000..2b1ee7a73 --- /dev/null +++ b/filters/replace_first.html @@ -0,0 +1,184 @@ + + + + + replace_first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

replace_first

+ + + +
+
+

Added in: v1.9.1

+ +

Replaces only the first occurrence of the first argument in a string with the second argument.

+

Input

+
{{ "Take my protein pills and put my helmet on" | replace_first: "my", "your" }}
+ +

Output

+
Take your protein pills and put my helmet on
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/reverse.html b/filters/reverse.html new file mode 100644 index 000000000..6b552149e --- /dev/null +++ b/filters/reverse.html @@ -0,0 +1,191 @@ + + + + + reverse | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

reverse

+ + + +
+
+

Added in: v1.9.1

+ +

Reverses the order of the items in an array. reverse cannot reverse a string.

+

Input

+
{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}

{{ my_array | reverse | join: ", " }}
+ +

Output

+


plums, peaches, oranges, apples
+ +

Although reverse cannot be used directly on a string, you can split a string into an array, reverse the array, and rejoin it by chaining together filters:

+

Input

+
{{ "Ground control to Major Tom." | split: "" | reverse | join: "" }}
+ +

Output

+
.moT rojaM ot lortnoc dnuorG
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/round.html b/filters/round.html new file mode 100644 index 000000000..4f0bed90c --- /dev/null +++ b/filters/round.html @@ -0,0 +1,196 @@ + + + + + round | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

round

+ + + +
+
+

Added in: v1.9.1

+ +

Rounds a number to the nearest integer or, if a number is passed as an argument, to that number of decimal places.

+

Input

+
{{ 1.2 | round }}
+ +

Output

+
1
+ +

Input

+
{{ 2.7 | round }}
+ +

Output

+
3
+ +

Input

+
{{ 183.357 | round: 2 }}
+ +

Output

+
183.36
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/rstrip.html b/filters/rstrip.html new file mode 100644 index 000000000..df9496781 --- /dev/null +++ b/filters/rstrip.html @@ -0,0 +1,184 @@ + + + + + rstrip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

rstrip

+ + + +
+
+

Added in: v1.9.1

+ +

Removes all whitespace (tabs, spaces, and newlines) from the right side of a string. It does not affect spaces between words.

+

Input

+
BEGIN{{ "          So much room for activities!          " | rstrip }}END
+ +

Output

+
BEGIN          So much room for activities!END
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/size.html b/filters/size.html new file mode 100644 index 000000000..3bf3fbe97 --- /dev/null +++ b/filters/size.html @@ -0,0 +1,193 @@ + + + + + size | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

size

+ + + +
+
+

Added in: v1.9.1

+ +

Returns the number of characters in a string or the number of items in an array.

+

Input

+
{{ "Ground control to Major Tom." | size }}
+ +

Output

+
28
+ +

Input

+
{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}

{{ my_array.size }}
+ +

Output

+


4
+ +

You can use size with dot notation when you need to use the filter inside a tag:

+
{% if site.pages.size > 10 %}
This is a big website!
{% endif %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/slice.html b/filters/slice.html new file mode 100644 index 000000000..9101d3fcb --- /dev/null +++ b/filters/slice.html @@ -0,0 +1,204 @@ + + + + + slice | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

slice

+ + + +
+
+

Added in: v1.9.1

+ +

Returns a substring of 1 character beginning at the index specified by the first argument. An optional second argument specifies the length of the substring to be returned.

+

String indices are numbered starting from 0.

+

Input

+
{{ "Liquid" | slice: 0 }}
+ +

Output

+
L
+ +

Input

+
{{ "Liquid" | slice: 2 }}
+ +

Output

+
q
+ +

Input

+
{{ "Liquid" | slice: 2, 5 }}
+ +

Output

+
quid
+ +

If the first argument is a negative number, the indices are counted from the end of the string:

+

Input

+
{{ "Liquid" | slice: -3, 2 }}
+ +

Output

+
ui
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/sort.html b/filters/sort.html new file mode 100644 index 000000000..800e0c42b --- /dev/null +++ b/filters/sort.html @@ -0,0 +1,187 @@ + + + + + sort | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

sort

+ + + +
+
+

Added in: v1.9.1

+ +

Sorts items in an array in case-sensitive order.

+

Input

+
{% assign my_array = "zebra, octopus, giraffe, Sally Snake" | split: ", " %}

{{ my_array | sort | join: ", " }}
+ +

Output

+


Sally Snake, giraffe, octopus, zebra
+ +

An optional argument specifies which property of the array’s items to use for sorting.

+
{% assign products_by_price = collection.products | sort: "price" %}
{% for product in products_by_price %}
<h4>{{ product.title }}</h4>
{% endfor %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/sort_natural.html b/filters/sort_natural.html new file mode 100644 index 000000000..bf61ca7cb --- /dev/null +++ b/filters/sort_natural.html @@ -0,0 +1,187 @@ + + + + + sort_natural | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

sort_natural

+ + + +
+
+

Added in: v8.4.0

+ +

Sorts items in an array in case-insensitive order.

+

Input

+
{% assign my_array = "zebra, octopus, giraffe, Sally Snake" | split: ", " %}

{{ my_array | sort_natural | join: ", " }}
+ +

Output

+


giraffe, octopus, Sally Snake, zebra
+ +

An optional argument specifies which property of the array’s items to use for sorting.

+
{% assign products_by_company = collection.products | sort_natural: "company" %}
{% for product in products_by_company %}
<h4>{{ product.title }}</h4>
{% endfor %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/split.html b/filters/split.html new file mode 100644 index 000000000..4d99734d9 --- /dev/null +++ b/filters/split.html @@ -0,0 +1,184 @@ + + + + + split | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

split

+ + + +
+
+

Added in: v1.9.1

+ +

Divides a string into an array using the argument as a separator. split is commonly used to convert comma-separated items from a string to an array.

+

Input

+
{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}

{% for member in beatles %}
{{ member }}
{% endfor %}
+ +

Output

+




John

Paul

George

Ringo
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/strip.html b/filters/strip.html new file mode 100644 index 000000000..dfb18ca2f --- /dev/null +++ b/filters/strip.html @@ -0,0 +1,184 @@ + + + + + strip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip

+ + + +
+
+

Added in: v1.9.1

+ +

Removes all whitespace (tabs, spaces, and newlines) from both the left and right sides of a string. It does not affect spaces between words.

+

Input

+
BEGIN{{ "          So much room for activities!          " | strip }}END
+ +

Output

+
BEGINSo much room for activities!END
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/strip_html.html b/filters/strip_html.html new file mode 100644 index 000000000..d89510a9c --- /dev/null +++ b/filters/strip_html.html @@ -0,0 +1,184 @@ + + + + + strip_html | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip_html

+ + + +
+
+

Added in: v1.9.1

+ +

Removes any HTML tags from a string.

+

Input

+
{{ "Have <em>you</em> read <strong>Ulysses</strong>?" | strip_html }}
+ +

Output

+
Have you read Ulysses?
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/strip_newlines.html b/filters/strip_newlines.html new file mode 100644 index 000000000..47678e354 --- /dev/null +++ b/filters/strip_newlines.html @@ -0,0 +1,184 @@ + + + + + strip_newlines | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip_newlines

+ + + +
+
+

Added in: v1.9.1

+ +

Removes any newline characters (line breaks) from a string.

+

Input

+
{% capture string_with_newlines %}
Hello
there
{% endcapture %}

{{ string_with_newlines | strip_newlines }}
+ +

Output

+

Hellothere
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/times.html b/filters/times.html new file mode 100644 index 000000000..c2a9b607d --- /dev/null +++ b/filters/times.html @@ -0,0 +1,196 @@ + + + + + times | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

times

+ + + +
+
+

Added in: v1.9.1

+ +

Multiplies a number by another number.

+

Input

+
{{ 3 | times: 2 }}
+ +

Output

+
6
+ +

Input

+
{{ 24 | times: 7 }}
+ +

Output

+
168
+ +

Input

+
{{ 183.357 | times: 12 }}
+ +

Output

+
2200.284
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/truncate.html b/filters/truncate.html new file mode 100644 index 000000000..d185bfd90 --- /dev/null +++ b/filters/truncate.html @@ -0,0 +1,199 @@ + + + + + truncate | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

truncate

+ + + +
+
+

Added in: v1.9.1

+ +

Shortens a string down to the number of characters passed as an argument. If the specified number of characters is less than the length of the string, an ellipsis (…) is appended to the string and is included in the character count.

+

Basic Usage

Input

+
{{ "Ground control to Major Tom." | truncate: 20 }}
+ +

Output

+
Ground control to...
+ +

Custom ellipsis

truncate takes an optional second argument that specifies the sequence of characters to be appended to the truncated string. By default this is an ellipsis (…), but you can specify a different sequence.

+

The length of the second argument counts against the number of characters specified by the first argument. For example, if you want to truncate a string to exactly 10 characters, and use a 3-character ellipsis, use 13 for the first argument of truncate, since the ellipsis counts as 3 characters.

+

Input

+
{{ "Ground control to Major Tom." | truncate: 25, ", and so on" }}
+ +

Output

+
Ground control, and so on
+ +

No ellipsis

You can truncate to the exact number of characters specified by the first argument and avoid showing trailing characters by passing a blank string as the second argument:

+

Input

+
{{ "Ground control to Major Tom." | truncate: 20, "" }}
+ +

Output

+
Ground control to Ma
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/truncatewords.html b/filters/truncatewords.html new file mode 100644 index 000000000..0ab724c9d --- /dev/null +++ b/filters/truncatewords.html @@ -0,0 +1,198 @@ + + + + + truncatewords | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

truncatewords

+ + + +
+
+

Added in: v1.9.1

+ +

Shortens a string down to the number of words passed as an argument. If the specified number of words is less than the number of words in the string, an ellipsis (…) is appended to the string.

+

Input

+
{{ "Ground control to Major Tom." | truncatewords: 3 }}
+ +

Output

+
Ground control to...
+ +

Custom ellipsis

truncatewords takes an optional second argument that specifies the sequence of characters to be appended to the truncated string. By default this is an ellipsis (…), but you can specify a different sequence.

+

Input

+
{{ "Ground control to Major Tom." | truncatewords: 3, "--" }}
+ +

Output

+
Ground control to--
+ +

No ellipsis

You can avoid showing trailing characters by passing a blank string as the second argument:

+

Input

+
{{ "Ground control to Major Tom." | truncatewords: 3, "" }}
+ +

Output

+
Ground control to
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/uniq.html b/filters/uniq.html new file mode 100644 index 000000000..033dfc7f8 --- /dev/null +++ b/filters/uniq.html @@ -0,0 +1,184 @@ + + + + + uniq | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

uniq

+ + + +
+
+

Added in: v1.9.1

+ +

Removes any duplicate elements in an array.

+

Input

+
{% assign my_array = "ants, bugs, bees, bugs, ants" | split: ", " %}
{{ my_array | uniq | join: ", " }}
+ +

Output

+

ants, bugs, bees
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/upcase.html b/filters/upcase.html new file mode 100644 index 000000000..f7c9f6880 --- /dev/null +++ b/filters/upcase.html @@ -0,0 +1,190 @@ + + + + + upcase | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

upcase

+ + + +
+
+

Added in: v1.9.1

+ +

Makes each character in a string uppercase. It has no effect on strings which are already all uppercase.

+

Input

+
{{ "Parker Moore" | upcase }}
+ +

Output

+
PARKER MOORE
+ +

Input

+
{{ "APPLE" | upcase }}
+ +

Output

+
APPLE
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/url_decode.html b/filters/url_decode.html new file mode 100644 index 000000000..85954831b --- /dev/null +++ b/filters/url_decode.html @@ -0,0 +1,184 @@ + + + + + url_decode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

url_decode

+ + + +
+
+

Added in: v6.1.0

+ +

Decodes a string that has been encoded as a URL.

+

Input

+
{{ "%27Stop%21%27+said+Fred" | url_decode }}
+ +

Output

+
'Stop!' said Fred
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/url_encode.html b/filters/url_encode.html new file mode 100644 index 000000000..9f9533b37 --- /dev/null +++ b/filters/url_encode.html @@ -0,0 +1,190 @@ + + + + + url_encode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

url_encode

+ + + +
+
+

Added in: v1.9.1

+ +

Converts any URL-unsafe characters in a string into percent-encoded characters.

+

Input

+
{{ "john@liquid.com" | url_encode }}
+ +

Output

+
john%40liquid.com
+ +

Input

+
{{ "Tetsuro Takara" | url_encode }}
+ +

Output

+
Tetsuro+Takara
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/filters/where.html b/filters/where.html new file mode 100644 index 000000000..2898d2573 --- /dev/null +++ b/filters/where.html @@ -0,0 +1,200 @@ + + + + + where | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

where

+ + + +
+
+

Added in: v8.1.0

+ +

Creates an array including only the objects with a given property value, or any truthy value by default.

+

In this example, assume you have a list of products and you want to show your kitchen products separately. Using where, you can create an array containing only the products that have a "type" of "kitchen".

+

Input

+
All products:
{% for product in products %}
- {{ product.title }}
{% endfor %}

{% assign kitchen_products = products | where: "type", "kitchen" %}

Kitchen products:
{% for product in kitchen_products %}
- {{ product.title }}
{% endfor %}
+ +

Output

+
All products:
- Vacuum
- Spatula
- Television
- Garlic press

Kitchen products:
- Spatula
- Garlic press
+ +

Say instead you have a list of products and you only want to show those that are available to buy. You can where with a property name but no target value to include all products with a truthy "available" value.

+

Input

+
All products:
{% for product in products %}
- {{ product.title }}
{% endfor %}

{% assign available_products = products | where: "available" %}

Available products:
{% for product in available_products %}
- {{ product.title }}
{% endfor %}
+ +

Output

+
All products:
- Coffee mug
- Limited edition sneakers
- Boring sneakers

Available products:
- Coffee mug
- Boring sneakers
+ +

The where filter can also be used to find a single object in an array when combined with the first filter. For example, say you want to show off the shirt in your new fall collection.

+

Input

+
{% assign new_shirt = products | where: "type", "shirt" | first %}

Featured product: {{ new_shirt.title }}
+ +

Output

+
Featured product: Hawaiian print sweater vest
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/fonts/icomoon.eot b/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..04bc4dd09de02d79a4e545ddfaff421245bb172d GIT binary patch literal 5036 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 literal 0 HcmV?d00001 diff --git a/fonts/icomoon.svg b/fonts/icomoon.svg new file mode 100644 index 000000000..a4d46b5d2 --- /dev/null +++ b/fonts/icomoon.svg @@ -0,0 +1,27 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/icomoon.ttf b/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d0c03f0cee377080943dbeafe2262ce113edac56 GIT binary patch literal 4872 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 S0+XE!;EYgwR~!Gw>wf{?A{v$e literal 0 HcmV?d00001 diff --git a/fonts/icomoon.woff b/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..5513537b74fda1f290c39676fa3b59bc6e3c25d6 GIT binary patch literal 4948 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 literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-114x114.png b/icon/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..deda0a1e7d4981ba5309cb39e28936d32b9177f3 GIT binary patch literal 2576 zcmd6p`8U-2AICp-5z3makVbW*u_VUQ*G^2bl&lvSQufH5y4Ez7h#A~$UDAZ?S;AFa zDNEOkZ5WK5p|K2OFvD!V)A|1N{r&~t*LlBR&+~ep*W5D2M<6 zAZBN4>CDxrpIexZ>)ZKa9J#_DWCk?@fcM#=EI$Emta8`Z843W8K>(1L0ssu|Q6dQd zV!!~f?h62r0sxSUDEZ6D7yx)lHyvE9xC!D!0I z>`~hihjYZ{{Isan#Ru=_k2ptM^LRJIWOLYTj(_d!jW+~3gUw)ZZdFc;CSfdJO;8V5 zbS4}6h9H`ZF?cz?vB%syWZ9HXYNBw%>5Spy$(Y<; zQqRKfskEWAu9Z(SJ2HsD#~n)_Cby-Y4c>ph&@e_mnS!kt+K_mPb*r2%{AcZY*%Xbz z&gmhU7Ee&Wu5YJ5PE%-yZ2Q+!CsMEt<6AoitbdhERE}(t_nC%;_}AEtwOz)QKgNo` zuMsJSxjjGT$Ojj4M)B)3)y$E^PsHKXedXuFPySl|XK7b4eJG}F>FeCisnntH=7qlq zlzR>HzBRKfHm71_^H${ygUu<$tlvZv4w&qheI)zxsjTkR-2;|+$;1ww8QZ>OREUpk zSqyHR*UZHccMg53XOAUfE+R*5ODBIp;(TgmK`%xwp>R6+W7mrDH_E4yKNAc3*XnTO zo(1YW`CyJrpCupQe(V!A=u6uNq+JGu#`JnOv$}KGJx4|Lk_MLd zQ-`|dsFUk7^%oH^O6uP$kslVrTNfi*7Yz!=`EslyxU;Ss?R>)p0FIq856-I| znPu@qliLV8f*0x-3OD#h5G6sj`t;E_RJm+@%>an^zs_uhy=ht-e#pp?w5PX3B=xAwMn zgR=F=O=T!brlXg1RSzR37Km>zcequj=YfnPD;q_W-?cfDR$He8MH%;jH@b{swlL}5 zk9r!zZs%v~+#0_-spMD)$&zxZ1nh|NcBst}gO^`%oxc$?XUhVtg1@QDH%+u(nTrEu zZ_e>uR|~&C={oLjhS;2cc=>b(-PE_K*1$XilFrNA>N`s>T}ef?6n}knNt$fb!Y58d z3Mn7guotnIl@@cmPE+bWD`9d80Hq3PPF<5tFJg#aOSU-;myTe(cFLYZWYAG?k#$jVn*R;xK~F0BTDCOe4IKW8d`((qD>!+=1`w;*c2fau%) z89nm~3y&o$V`^>lTid+)i+1uVO?L%Tjf37R6(Z4hbj*mTFmZT2#>iX^SFRpproebf zd)U9LUU5gk{df=(lP@dnaK`0=|6Q)A{h*p-dCnB5B;?X-$1VuD9EF)C~c=Ry*UqJ{;TH zq|S?~+J@-E*Lq*K67C-R9@Sruy(Bkozc43I1e!BGmLC z=TfkcmXC0FV6Mc#N?w|lPvbd-MH@&Vv53cgRM5flM0|9Pohj%SlqLTkVXCYHDF>>Z zI|}XDh?ZQ`bkzP{3H#L^<=X8Wlv27Dg!24hk5Z38gr3Mrz&ATYz1b9bB|a;tdh~Ee z_q&|BU7R96Ve@s@^9O}QdldTf6kljC694(nbB{h7Cm+8bzxcQ=JlIb$mYnbAPF#4< z@SsSx>l8DNuV(%ZqvBrR@YSs{D*xzQ5mv2p-lvuPDt7)!0%KLelto&03=EU0{qr%L z_jZaI0pVCEL2DjrOW0X)W4|T@PfR2y)cK_F5#8M2=0M}9uA@avTU4}vIBItcQlzX;dn5{yy9NBI zm%n-!Xsqj1c}0_9z60||!b|f}ELa0w5Lj`fRz0cHW={xB80P`@CUGt4gl9{C-{{iXqcoz)G? JdUN08e*?VdAhiGh literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-120x120.png b/icon/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..d20c9f543646c10ee68b17e7df52e5d3c573a50a GIT binary patch literal 3469 zcmV;84RZ2{P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-144x144.png b/icon/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..1f54e5fe07dfda6e6dcdd8db6953ae03fa4baf03 GIT binary patch literal 4188 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 literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-57x57.png b/icon/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..af734a1254dc12dd9fd36c77bde1ca1496d8aa0d GIT binary patch literal 1401 zcmcIkdo&Yz9RGO~d6e>4UJ>DzD>IeshJ+Z6Jfb?z@tDo~OtW37ndz7H;Yx~eMaC;tQndY%igME0`XRna3i9EONJjt~NXp`nJyLFna`Qm~aLW{c8bXlAT+7DvAJJz~6%kTnj^KSfeF4yMOMX4VlN>@8FxK>O)Xjr2 z4sFT_i)683a|;zu`eD0FsE4bw>2<}zMk!IiBaki%vvRrztbg+Og_#L}Y!1TN(a){7 zk~N27oYw%WYKCc7&g5k&)IRhMjd$1YiPB7{tr%^0)hDd9v!-|^n%H)Ym`R(HV#Vg$ z!etj`w_-DyXzXo_kxkaNF3+xC&Wtio-%h`2ROBvaFz*LD7&O!ZQGku^kE^-klpNLUF+XA6ZbmGA<}Tc25Ht!ZOyysn?Li}~pC1dX zB4yTzAT!a6CoH&jI!c<|{nfS6aScbZF`fCRsFi_@XI612^+dnaXAb$=k)I~J`}Qdm zS7w;cT#L+$`O5uW%an5CggQUzSZ*6T3I!`DgB>U3#E#oGrq7r$_J=-_d({mbD z8O?cPl;9bUgPdfBSd^=LZVf-ora%hRhRXlC`hr5D3X%-8M}~8_dS^e*lDq5~^w64f zu)f(LTipUHWbLn`4KtTY&(0eok^0fJr=d79^Swzhe_h*jurz+hsr2o;*&dIML)8lf zbwtGf!F-Of9;3Z{*(<^hgKPNuCgy@(^AbZ+Jt|-SG>$({p|OY8AeNPAWGF%Lqxnf} zc#vgVq|Ic9dM^EilRHn2-*L2;NSfBT-RM=_bl(0r4zcwx0GqFKV3uOk+b!XZ+}sG1 z;iIo-)J=6L<3xepgRuG}ao#iw%dy%mMK6fllULODO_rkBpmI74hc)VK}AddApi&$Pv=(`f>ZtmN8hrv literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-60x60.png b/icon/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..917c3cd967534106fb8dc36e32a76de1e987178e GIT binary patch literal 1480 zcmcIkdoxj2f?LzgT zVr{iW=M|K;n7%6_LhDh_2ooe34Uv$<;_R>O|DAL1`Of#9``!D;z31j(d`|1?nCbuk zpo{i!$ExtyR%&Z(Df>3}Z?sy{GssU#Z;0*G^=0&dL?apz1M7>$FU+ z#8!?*HcU#^73kkazONboES0<68N%HEB;8PmBpZmEgCJ@Ts(g4wCSMS*J753ka&vHI zS!PEYa4h-27q3rk2d3ktWR2qOp%VRTxR#OkF*jsFuo z>m04G>SC~q+4eY}S|~4&tzG65c%#lD_#(#SbyAc@7IN;#0$%PBD67yU;0-#;-9}K9 zpWL#Y#|rWQ`<-~J7Aa)>ZbBOM;RUAgDvHC6Aej__Ga8J{`4jy9;!sRx4GnIZQ+5k# zLu7sX(~gNJohNzqo(W7yMN&onQkR=fR4crw%+~BUb%_(E1K#6pwX|%cO+Qu=5E?A* zelMSQ(x%%&Aj37X8A1bDk1IZ7Ef~lp#4V`5*lAw{!1=}WA6(b9@- zCW-yXfrEo3Y~w!b_Lca#X~pVucYHMCx}m%b-%XyDrdPc{z`q?`>~ph}U_crdiVQCG z7+<#sB#&VFX!?9P@E@PQB` z8zTS!AVJuG5S?QGcF=ZRjDh=S>O?;Q6^sIa`_;x8qJb`Vh{c8k1Hk3|0FXxkfK6Q~ zZvg-@VF2(x8UT)3;HJB8#|6jJFfNh-5f)uc!wS3f%6DOJ` z?62`4h3xN#B^#UCRi$Q0u8#P5(kP!rA6oeM@uOO^b+-Lg(ZHNyQ+ujal+``6rqW=V zg^Bm4mKB;~Ka3j}u)g|bQls5^zpnPVF2LV76}%U9h;Wp8TMABUR3=sK{M2@VYVoW}$dRC6LHnX`|Ci%6kIYE(&K~)ktdR zv`rZ|w_jX0ETKP>)C?_{*lk|bt%WN&1RttfJyx$OS+Y}DGFeo*$f>uPIH z;gdE+&7&(a?dGZ~HzNp|4IV-bz97OHS-bDBt1bvr&Q^#>-Y#J13xbVr6SQlnqICK4 zB(&Y}KgNgG=2Y8Nplh1EGYgXymzh&4Y2ujT^mQ0*BS;L>iNSr7W7sL1`KIQMl(^~&D zGvx+$F7~8G`dLH3RtG9>IcRR^eVkagt_)x$*SJI-aJ8#l{%zNId{G3O#A^00BnaEF zNA30Hko)@}jlR`J76wBO=RjE88o$NB81tT0bftfiaWwHbJ(Ayosi+P6$zf+!*}Rs3 zk9rV$na?gi~MrZtVx_?5UtUN)CoORMX(ugP-^3*n(501`GQ4b9N+{`exC1 zGQU!bcn&&WE^}mP4I8LM4@0~RchU%_JQ zHrGXKgO=`o9{Eq7r|a8OT~zOxHa59y@~C<0QQA^|W{VwlnN~^J>BuH{=jz`+jd<{O zuO2w_#)*ZCU6)Ei%R#t^LW;*Z)WWN*l&{)480L{!E2$pinDjEvA~IT1GIKn7q5V?F z(5d4%&qn2jntLuqv&eH}g?Zv!t5=5d8HjG@7qQ*ZTx6I*U+R}2E!3ws>fw5yQj%pM zSjy;_%8VK?)Ymq9uji0PmP93d>1PKpl4b9w5=Ho7;+*`7(%#Q<{xJ_C($n4JJ~Aep zOd^uwkg*wYIsv?3UNCnU+}-PNn5PfY#}f(nItYUyVX*vPjFJBWQqo9C@!9_acq5Q- z_&)$eN~OXj(iui9bNDj Dw3Jr~ literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-76x76.png b/icon/apple-touch-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..d941574d79543a46d9ce918e8255a05ac76c2bc2 GIT binary patch literal 1832 zcmc(g=U3Bd7RP@GOr+@`U4;Qe1rZHRDWZV12!s}zz(@kY838GxfPfOl_f&H(W63;;Yv0RTsM^>_&Y z?t=k<83+JoWdNWQiFxmK1pp3dx;nvZg%6IT;{PuplY*B_#!08(HS^+^v(t2k_qNE=h0tt zy67>+`u7L#7+U!w6y{!N%dAW){$%#>(EJYnKmc#1DQ6OTW;eO~gPZ@Fl1m$UM`3^G z^4(rie@5Y(##lQXzI_Gd1&(R`oK)Diw6?=Fe@c`}!KHtiU)tgr6pzQXfBVM%u7@5A ze=|#C?Q0i|l9;<*byFPP!SKS4YR)jUnmWMPI-W(ac|qRV=XKFG6*CCt<;1mJZX1<- zxpZP>n}a2;$)bh~ipCc=IrSr}M^o_(_V?#F=GlVLY1V#m{}N?oFSmO^BX?wCX*c=f zoa&GMw`1EGDw%|S##ZE8x>5$AduH?CKoIhJMj?IZJ#lzV%blt#s6<`G!$e$MnYd(r!TGbTwh+Qt5Jt<+0$h$$l$Xe%1RE{g zA5pxpQSiZUOzfG(baH0o%gJ!-a$^bT8WR_ZbRRY;TmBk(=F7lz%M``bK_j|l+BYk* z&GFT2lzMSw9LnF=`5-o)mS}tmfvIs{_J<};)xUnc zXoH@KiY}6e_ObnU>h5aH#X^7E*GbyA=UKFL*wUvkf?>PyF!$DV#C%c19nD&(=r7Ic z7t`ri=y?&PwWM*PtbX;cV#X0`Wqn(RPPsTt+?Rpj!o;wN8rgLJCAbmjHog{XYPEkN zu0``W;e&5GczE0?=-z4Ndu>Q*mz*%K&%ByAqgGdm!GQw( z#vF?B&9`MORBADJt_5*k?;m-3zBk~igYsCMQLaR%*LXYTvsV+W=j5TjFv}p)IZ3~d zXX;TJCkV@{me1NsKHnkg1U*o#a{*D0lRU`jd2rkF0R)wbY4f(M&+jjT4XwjR z6(uL%JF8r`8xliU$hRhCNQN+Q>O`6y!d%xDiNpC?hIwDiV$tN>`_7*vYq6S7W0Sa^ zV6mVsQ4nNxm_CkW7glRMXp*bRSG{J1IO|fAFAn{u2KG&oAo)+sDeP9&xeyVoloDhW z{T0*eA&Pm6SV129aLlU<$BsV6eT^m?L&Occq%4dgpZDCYhufKmr`@G#VkgfjL#+a% zrKj5+eNwLrO@1KNu6yrr*j$HX`q-tm%8DV77?B$(E!Vwjitr#aT}h`7H74+E&?(8U z=m&KK>n07kS!dsWb2cu4tx9E>TJJ`E zXtm>vaw+fr_O+ySZKqac7b)RKJ{@E06B7)NL7D|cBZUGOfDOQUU_(8F%P@UoGh=-- zLjzqf*bEF#ZjdtjFCaW3`1g?b{{f6l%?u6y1E45pe-Z*JKPq@cgv7+cqmh7Ba0CLW d4he_fM!F;6!SPW8Na6Yd0EjKr=9P6|%HM$Clez!^ literal 0 HcmV?d00001 diff --git a/icon/apple-touch-icon-precomposed.png b/icon/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..9963f5c75d8aa26ad4740a2f2ce67d8f69e41883 GIT binary patch literal 5143 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 E08YJ4RsaA1 literal 0 HcmV?d00001 diff --git a/icon/favicon-16x16.png b/icon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..de73f6fe6dbec174f7dce939a4a19968910bf18d GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>@4vU-eml&)&fR#XY2VZT|Np=H z_S{s%(`Yf`?}qn>-tl!@Hd}b z=D*AY=zgw}AirP+Hs7@`{z^{&xOFd&#v7n0W0JSKi!@Whl_fw9dx@v7EBg~>X?|l( z8=J?{K%v#1E{-7*ms9(%i#0j$xHw0i+LX#jwmHR`+9~woA?<1-77Q$I$O2GHKHUXu_Vl&Gd7@As{8d@0}X&V?=85lIK;9nO2FW!Nk(a*chUr z<)%6tP=h4MhT#0PlJdl&R0hYC{G?O`&)mfH)S%SFl*+=Bsh~8&;OXk;vd$@?2>_17 B8btsA literal 0 HcmV?d00001 diff --git a/icon/favicon-196x196.png b/icon/favicon-196x196.png new file mode 100644 index 0000000000000000000000000000000000000000..405133b2448c9d63c48b86b54e089a0321746fe1 GIT binary patch literal 5577 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 B#%BNk literal 0 HcmV?d00001 diff --git a/icon/favicon-96x96.png b/icon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..6216099fdc0cb05afa228eade72e4b45825d140e GIT binary patch literal 2223 zcmd6p`9IX#AICpKmd4ePkSs%?ER(_2LK)kTOR^_)?Mq1{Qb~<5Dp~6$q9$Aw*$WkA zt1Pz}42Hol_HD)t1~X$8-|6xF>HGZ)?&I-3@7Mc%&UwDiFXx=cJJs3AP8xgw3;=+% z{TUlqq5A(ClA=OSw0-bvVON;tSxW$@&645;hzWD`pfj##0pPYa0H81cuq~WIEdoFs z8~~R60l+j502HHNG`gGu0Fg9jM|Y%f!=7aPzr>``c&Q|u6dLDJGMf2)A^qEY#!o$|Not+)pCfDQ{Q3{O*C*k5hPS37#4E`GU4UG@0p^UGv4`=oJz9aMaf}!Ot zjSPa*-=i!ppD@1(P3yCIIlRv1{WHx}PVJRW#-Ge1(l)ql6YGi(dSOonK8>!*rSxcL z^^<9=+9A3urbj)!Z(w1wj6jpY;FTWsc1|&0;g;p^_k1O<{nfen8ydG4(^E^Nr+u3* z?xkXyXLGxjZhxLmZ=a9+FqzmiD-i62R8wN=r~Jyt!>cLVJb~w%G4C=mmoM1b<~tOR zoGTe+bNNg*&l*dzFC=Yp_>3*CdBKoH!SEW3N8Q*ykxMkmB~mxIb88%fr-KwaTPM3; z|M9>SgFQ-RX=M_QWc82JSc8k38tHw9G6=&BR1r+U5}!!*y; zk1!g^Yp$=y}X9BKM+c-yfD4ZG}=(Xrp;z`lgGy%}21 zya*%{Lr;B@Lxtg%LPFHNOs1NO3XP8Q9br`C3Lptl6F3^pTjA)KTVctdjvnOx_d2V# zb)&a+nv**OU5n=ANB=~7l$h$y>v*e{fzNyHYhP8XEUPS!lJPbf93~FUrmm_*#OCLV z70qkEHH2VTXB;YW*3DlJc{yZC_I`mipcW{|C(rZ1Pd#!uyNdi(NU;Sy2Ldu4QpAWdo5K zl;sA>^vihzs?0D4SxFlHfsHN(NB3VAw{R4Da&Z7dDslR=O60}+`%`|u6G;;ymum&a zam(KFlXY<_7T00=Z4Fd-0edN|6bP$Y0Bl}Ll$Lfn_J_T!6uIKhQQVXVO0QT%+V;4B zdQ?L|2XsL)9g#g|eqx{0+kC7@4I&;Ge2Q)>($T`BRX24~yDZHE<>0HP?i!fmIiua} z;DP#?hgx?1sc}PuJ_p_jIu8fAbm|^*BD{kv|F08-2vn z2hNHqXE%oVij$k_AELPQToB|`S1HH0)f(~>Wv2#HQx}kqDb?_=IpG&T{btx~(7E^d zk92^|qSvoRkBVZ|rnVuE%d9RueH9P~!=i)VJ5=BG6n9+B2Ty64>0V5Gyb#>Vq@8!R zRZyv=iz%%hWSJ$St#cd=Pilz%IUNVP+gV@{XsVIExb4AM>67El zD@IX@jW_3sK`AmLf@w$rO)JlMY4-Md;@C;YR_i{BhiT0EuzG`Z{)#9u-*E=B4$%SyCD z5P_(A#3iQdmC&~ow5t3k1SAOMcbAAJcxJrArFy$JSYhhXUfA&=FCcD<$IjzD#JbJ>KoQ?PZcP{2X2toDYpS0LA4)VFl1k zWhkQnQ3${HJy4L{#WT$1B%3nrGUg!;cql6$QPYqP{p>SuAnnyreL7f1+~BIvRbzie zy*MNAX8{ud4*js}9#yAK_`zw#BE4dR17br=gJMF20vN%K;4ru`%;>ngp^2%9p{cQv z9vp58hbO(0GW{PQGAj5|=&k<)em`kyZ2VsUGjdp52q^tJ!7VB@Ha;LG1h5Q_3Jg)V dj|>P4aSaIwzIClTMA$_DfIZU5rpn46{U6$lSd#z% literal 0 HcmV?d00001 diff --git a/icon/logo.png b/icon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..90dc5b95cb5d734c792ba1435cc6c9f6b021ddf4 GIT binary patch literal 10247 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 literal 0 HcmV?d00001 diff --git a/icon/mstile-310x150.png b/icon/mstile-310x150.png new file mode 100644 index 0000000000000000000000000000000000000000..e1def8fcaf96001d3d5c0187817f697a58cc07f6 GIT binary patch literal 5371 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 LnPX~oapeC3yC2qX literal 0 HcmV?d00001 diff --git a/icon/mstile-310x310.png b/icon/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..0cec8c22c6565411aaff621f95fcd4719993e01d GIT binary patch literal 9195 zcmZ9ycQ~8x7e5{&RIDnYc8gjORVr$=_N>+(NfCR+s#&W-tyo1-v#8o5lo&CR)+lO^ zrb4BYiq+EcM(dk?et-O~@ArE0T=$jxJm)_5IM=z)Ij@sue#ejc0PMy_dX@kH z9qiwGj)~So?Hj14HH==`X4(KiTQ=*d3y}8zlADpG82}I^2>`@D0sxL_UGWH)s17UJ{c&iuxH>ti?>J&`ft#NmF{H_T^FT z=Tyn!;al#{$2J8*R#LIDVv>#BdX%j+3{$?|S^U$Fu-M8hsn^jhlxWzfSu8n%6{m9@{DJ$9y}%8yW@SR`>96&c$PYB0!~_eZp_@FTW+(`0wTXYmkPTQ|p&GZYA%7gJ+^(y)5dJ>v_SMMmzgXHIAf;@>95cg2otaA4@%_L<={>Qf=6+z~ zPB_D_oo96w5I!KnI25?dhGiEN#e*WjdjU<5p0NmoX#+aU;~|>{#|kEM9-3S7#GH_y zn9y8tZ0&iK;R9PASGQ2(%+%iMlFTnTTjDDFDesZ8?P{3$3^*^LS?l=G`yRps+7GRS zW{vGqGUo(51OzbtO`RMFH-7_8Noc-wzY@lPBFeV2#vcM|UGe~*oVg=Kx)~zRHEtAm zhuMJxhAWW!b%sgdTzlFSf095uaLxY-+Lr|Hbq1^fccvd&Twc#k@P8Hc=)Di&B)-da z^{rKGm&MXoU=#k>l#*g^)1`A+#Q}t4`3~xEpjbBP;OQfw$1k7qaztK42*unA;>0Oj zG$)v0L~5>WT9i%F2hz1L$P)`tZw}y$JHP?DQ_MXAS|^~C2jw;+J~KtMJ=-1XEfr8_ zHD#w(?TmzLYUH0)(FYvxpv0HJzUxR<@758VV%iolTy@1np28FG`~^}FEdpL{L?1GU z0;Ybh-ju2KiYLd50tTlaYG3XO2I1H@xV*jG9H$@_6=Ol=bOEEib;5!_!9mnoB%-#( zT%E6R>gJ=~()OFt@w-TymGKs)B=WH|X{m11^I+OF-FN!;Dy#@}*DXDE@DXgSwIspc z$Pta>kL2D9Mp5URc7Kmqr?oZ1*BIk;ckDxfD?vOc-3?G@gsbCJ1ag!qEn~uhQftrm zOKO`B957mo6s&;EgadZz2U2;L#@(Ux&lq-we%CCggSrQJP_bWh{CSTU_qqtw*e=rq z9P81|y)ZcbB2PfS45>HN#)r@4W!bynEtmw?GeuPTlK+=G+!ll|OKc}i!Hh{xQ?2x^ zd#kV+cFJ1RV@~(`c{{_lT$}{w{PG`0&D+%XtEyK7%z}iUoh1A>lenLvyk1izduRF2W zuR8wfIM)+PR9Uf+G>2>9cnm#>b6zySN)YAfIK55Mj@$jYD$kX@GsK~@x)$dGX9$o@ zY=$hf4Bh$M{Wb!x2cme9d@gr&IX@iROi>~wAA{#F1kHCZd{ibSko_#`(hgq6LxHNSh?$e8yG)sL*4C&V z-)#*_^v25doK6z(RCrJNw&9}fCX%`tSDsyF5r*CkPkS<>OM0J}-Qg@9LNJ?X(^qdZ zF{_kpzsZN3p1HHe&Yv{Lgs?l@hjpYmx<7YH(KKDxo@VKpllHK?eu!>7kx`5iUY%16 zH#X%%^_Y{>l8PlkdIo`fyaD*in2)v%E#BEXwK`_*8cui9@GoA}lX`WwPwHrFESxTO zcME)FjAUeSEjzWIxAY}z-EbXp`G`sgPK3G;puc*TOEjF$<G~;6)v2=4o+ips-tj zz8wi^b!b%`WHJwh-m~j4Jlv1={?TldqmjA|g`&DTuwcPui%XW)tKv_CT4G z%aK{1#`8`dCG*D3ys4pC0gSNYJMiW471KYA+HwG5l)u@gBB{q(Ew4G!cyd1Bd80ki zpB^DDCqUQXTQ_#01A<~=y6+P-Una>K^kuhwz3|s$E7eta9cp<~xd{=aek2;W4{r-| z^gO*x8`PsSUh_4X_^@yRfelMqp4|9wH>VxX7G2PvQc~FBy~953N_F|LzRi6;$KvF2 zcmaYfuJ^@&6sJ6${I3-zF8*fIHZO8X8Z)8=j%Pc91?5h2YUvs5NNl|yU^@*pmRbf+ z_7fja&OWLx>bp1X0RJ+Zr;LRg$A;>w&^ZI-fA96{yWf`|DgR}b_jiQ5k#v7?`HX1* zHns~D`*4GjM>s=|+4$$RkiuQlk7(0%NyU1_Rqi^S&_zy2UL~|ZF5!SZ@NJu`p)k0!fawyYO&#G zK4}wYe`J1Ny;2th$z(fX+q1bCy9k?`8B1E`*!nGyw9KT;ZP;A&Uw}a+bdNqpfvU)$S@K8vtTjK5O&&VRVHSUD@XR}DG63H}vPxs~PKKK`#2 z-S(v)&gU>94;gi}o!BmoXK( z@he^s1mW(rm$Sy4M?8Uu^Qezn0LfaW%^0%~<`=MZk2gKo9}WK2U@~+3%h)*Cd08=6 z2gg}-))0T%2&snn-o5}ul1|u0p=@7FdKitdQywd;MLI9fGwVfiLUZAbq^K&4|F~m< z$Mj4x2-gy=6Q;H!p}({`SA^;JmlYhz~vE{mIwhr|rNK7Xa&t*zx6 z&S|s$vv*S&GhH|RL`7xO719UhzNJGvs~O`^(dUZZD$T|DjNYZABub|}6Z_Y0VgcmO z2h6vHes9mLTM$x|?@-a5P>`;kpYn*p>MWYLq>Kx%+>PLEU<<_rh)xbwDy1g`U)Ig) zWS<9@5wo^57Z35Ee8<;?Illc%vYC2dgw~zmcJFVIw}PJ{$@G1bhw30l&8bx7f({ei z6FuF1m|PyyrXZ@va`!$mWjBJmH>xyeBQ@J*Gq|SQ+dh1zmp#xtBJ?R{o4#Y7&?w!G zR|?aZ_GK65IA08;v8p*?%UJtH57l#0;Yv2xU)Uyx+4KD=OUki-gs#&33jyBYu}D3w z<|3b$5u9O}ZAlx~`B6Os)J{U_Zp7vA2v1!%lyK=w!n=!zpl?{zrur1D&NZ4p zsAf0f5^N;AE~l+&@#Yjj5JZk)d~ljcarz84hLTUaB2{aAgF1 zY?rN?DkXJCx1 zB{Bcl)^FI~?d-T*TZDtat{@07m!d_NE2R60fvpFtmJU#c--}iq-5;NN=H^rjxN%Q3 zoige~42Q!Qa5AaRokLuHh((O&rx{N+q9S$cloh;T)SHgpkLj|EqAjAP{0lf!LVWfM z+TPQVZM3}!?>cWR0xYP$LoAp#D$6o0#AR)bGn2;%$^!_getlAJb8>GLWVseZ<&7k^ zQ@{M?{7Hl{lzzg8%^5Cmz-&f8Me`YAckfv{?+! zce7QL6QwP#_9UR_fY*hJ3+4HJ%`~k=;t9Am4>4^!Hkn$Eu~p-RD+Q}vgVoX$(%6A( zws#?x%sxo1BZc0!K z!{c+NOx0l2>L|xrbIwO0e|MUBG!kCusJUxPrYm)(`;e8za5Zz-v!SFYen>T|&NXk* ziKVYUp||qI{kojWu=;RX@K2jZV38!J$u})4DR_KY=-lmJsz!kzT&}T_FegX2ZoaG8 zaXp|URz)Y7dv@8Ry6uWUT0y^&a|whX72BngT&NmKlEBe@_}=3FeLD|~#P8a^*;8Ea zFuXvPYN#~$?uH*BnMj7zK`@zZ^$^)V(xh>T1i28kj|`2ZCw_C;3C-@7wa?QDBm6dP z#<%__*Kvbhz%7r+gSwKZTK7FN$hS>Aq?jlF1FhqN3nDG+dYDEe)Yi`W*b19}`;$`54aVyxye9EShBPkeyBaTYq!fE2+?%uS;5iaf>6r_Rl`IK) zEWPLs03ycpv`Tv`5}}idpR6M=CJ#Zl3z&H<1Sjz_$gbtzd@h*Kw~}(Ni!ZTADaI!> zKgxXz)D(Z}xxwSYZ$z|Jv~VAFP3cR9j0u@Jo?c>*CYeZC+FcKWjnrtvzUvZgbtVak z&?%uz3Elas|1DOmqR3N%ju|o6TWQiJN!t#Sx}qC87bniMPThRSJ33$|$`TEY$IUDgQ^Y$^o354)2 zrb}n(jkeIaeB9|A}Er}u> z8%T$Doa4dP=H2<0b>I?)O=I3usH39!3;I)`$X5}j?vYbT_=1U#_Ljqve>CY%`{*_3 zw|=b(IFy**eH_N&TdeW;?{E5S>v-ACtO5*!0D20eMln*-Wqn_r4KlZ>$hQ{fxK0w1 z8~LXX%S7I9R+g4i?^*aR^Fr%Gge++)FhNLw(hUHs2M`jkS;KOCbCu*vZ2FD9JT$zivleA&JoK{9Kjg&tl-sJFi}~E!Zn$0{i|^UT#8d zsWs_+mrVT)*8RCJp1y~g(o5AT`D~4HPG`x#9}a3gW<579Ga+Ogf1+PvY#=~6DfoQf zKDjOOkD!_?4iT?Ovx~3CgtVQA?~GmzM42BiCwg3*c@NHv?Yf=JP3KbqMu?B`pysAc zlD{TGwUwT~$nkKomH%an^~o^n-FmIaw!wyDAWYJR(M`P+#^}%nmCCZ8&~)!CX=7us zeYQD!u&Ty?N5Fg7*0jB%RpiNlT6-fsEPdv_=w96}@AwbB>LS*kbj}${o0}MuTEn(2 z_*nZ6X4{9Nzt;TZ^UD_RNK?*2Zp5f$?!H)oBg8fVYS;Pw>0W~0G-iY@Twho7f+JHD zy_#av`dCjFfPD>`Pt@7QBu7c~9xPt!ifeAR!+LC>aIZ|2_*Tqp9KKo8EZ-9mvUW6( z96%YR-Cl`T93mG@zoF1Ak{lB2qxPO*8(>rzC3vkl|8LbBoRu7BC=oTpTUR zh9x12aAwnRDjzDHusVQ%_UmhjC&H0n#HP>$+DTnnb2ZarQT7i_nc}GU#X09qp-h6O z{`}j3by?s3Z`cOKFqiUxEn?u9f6O!jOmjdsThYuhUH78W<8QDwMj0y^HeUjlh>N-} z;gV=>7uoZ{r1RUCVYsRw!B%E$23&c7NkNIiH*oHhu6yQC{qYAK^;Pk(yzMykt^2+y zet!mS==T>>dx}6Ii>ZZyWglCe)Ta5bmaYG58@r}oE*SOf+N%C zZB!o&jI-?9+#y+eP-F6~cs(N*jYCQw%t_u+_u;-uR-0f6vEltD3mH6;Itxqn${w=j z@%=nE)L!q^$&?6z#owZzX7D)JGMi zJ$+WMpu&CaT|>8L0~f0jI9%@SULnHkC>{E;v`^u+DX-^^;C(i!X}kBh`tgGIAl48t zEubqZsb>qQP8@ZzugX!g@%y~5QD7D;e3ewrxC6MkeNy(uH`ud_Xo!|53CWtry~Ua* zy*C;9Rs`C&VQot40UlAFVy~Ct=iF)r{#yS;6z&L!*M>X?X8DlvVil2ZmcE_&BZPXrl0K@Hk6IUno^hO8zZ2?1L`m%Wr(L-pe$T<($bm8J7dQ8v>Ek}0tkSk%Gf2L|9fD?dzV}T_oV^C~ zo5E)=$$tGd_6i}w$I(D`n5!0k4ldDYF#d2GvE(%L;{n}7)fbu*kEDfh{U@`otFO`! zZYWE(Ge^_NqhSwO0cXKNW~`h5i9PAEEN&%m&(s`kE<|&?#I4%FBTCGhTMi}*?82NW z9y7tZ?8#IN?$7y1(jlIkyAspvEfP0Sv;S#i-9;`jxxD}xEz&)4h|hB?u4nbN?RfJ^ z;xqczVuJcpWWvrXMQ>?cAmW`p`IEw+!ANUP9R$vEk~O3eT~`^f5hX+jdt!i7m>4xe*=d2fYxFa><(mbYSR?Y3BhnWgW@$Y_6 z-G_XQ?GX)_O(SuScYoF3?8>}&2e(cpKQ`Pw*AHx4KmKIt^3oYvrAU4}js9z%$S@&8 zEEQE&ji$vaR-H`LMiQXBYP9pGqJy!gp=G-B-Lsx4u5C`?6a?*qmzhF3L6E(S-3Sqw zVHI+Jr|p)?jg{Lrt(i+o9Xo7}*~+w}kVFiqd-4#^Srqb7nA7R{q=eh_$C?o}!(AAB zaT$)U#I|ABDa>`g`y-Vtb%CatPi_eZoUa#EGnq!dZx5h({r3|7igd3Y)}EJL=Rpk! zH`Ho`Ve8Wo2Gnpl#F9-jkx3Rd`S^G}XlN4?)fp)BG07vdHFKudOK0C8IN`@UAtL6X zz-7zfZ)>b6g4J*dO_MbuEwVQVyME&T+&iO5+uaRS4F2V}`?2P4Fn?Js|LmhL$+SB_ z_GX&!d;B->tM)h=d3TI~-4#fd9P(AKu@qzS){V{TMa~DgT4XHAQo1^`9dRe>D1;Q+-K6oM*E!~%V%5+r! zY+6!ds?xzCo0rOB*qQIk6Guyk80oMZkikIv5l`jN@f}8Qbc=HeRfhJ<;f+QOi52iq zJU=z_GFa-Rt`Ts8am;(%ln}z;ouBh87Mns3@1cGkpp&OOO0Y#HLy1@A_t$7q2W%t6 z-ZP_#Ci&URIS?#fm~aMkx>YnSd7JB>O+ne*E#M5^tQ%H)9mx<*cg9U(1#-YP&UM|T zbM`z~b^KlhpXB@#(teqLkDt=0uxy@q?a%v;SN^!gjWgw?Y(u^A4d=E`QX*k>#K^|_ ziwOPGm5YNZsZXXu>|q)H+GnJO@AnE1Gzr-w|IzYo*M;_+C>$4K`8xbjU_=Y?kp2vv zoS>((j+N`?8{zX+C_?{9B-GB%8i-Yr6FrE;;D^uKm=N+ghX9p|B)nK9d`J<=nb8GL z9D@!A5e8>vwe=-#9J=x=M&^&hv#YV5>!^zcr(>o(O zpas1Iql-en-|m)wQ7N;>e$73Wq(C~dq`7kH^O4iXW(t3UJ2gbfWdekC^od4HAXic8 z3D&Fs+V?<>S>(i(aN#2_c!{&V`{veg`46?*I5@*yJl%c#1zJj8_{Nx_x}Lin2mM2a zQ#MIaU&`5+%xHA9Mwhmp0aZlf>h{kIs2;{_^j$#2@#%RzclVv4^6wW7BlIp}y-3k@=(B6MQ|2J`y+i30 zz44l4O?+44nRy~TBcf2S?Q=q5jEbIKa{D9Amnz2rMoyO#njs$twTU++xV}>jwu*ol zi)L-@1a{llOI=76QmRq#_N#K6iW`+oK#dl46{{$b@C$E%17r!YMvX^hq#x2ekcA2@ zFoHAN)oPUUI3P7OH1d2jO!U|4<2aCATjy8Vt}>Ec;;vYohBOoDX? zSxbeaow#q{9!T-KodRDS?V;@O7q+AwFDF|192RD(-zTeosMN|sWZEpiL|PWp2oAkf z|8X8zY$e)uS-bazTf8z)yg-YcY4qEA-+P}uc)|KlGxytqtZ4L5kykp~T++^U+G)L2 z4|+I{xfY;c{ukkgFFPukt~8UDdwXB>raHL0iByNRU3;RkP*F`=1|B{5+Qgg70iS~P z@~+|&%r>ou;BYN3F0JWugT(yWSXn#gCgXl9fr(7QAAbu_d?|2bIt_&2AzcVBUxpIg z6of086h7nW-1aVpSFI}%3emtd_6sr<0(+caIMPZbt*riSiVC)28$vsupUV+EO{LbF zP?{1h00o;sT@W;9W#b<`Ld%;Ij^=bby#~!O%x!xgeH3e_Em{Jnc5YiSnAz zuf;Ym>Z_p18p=HWM|*^HQTK#X?FS9fx@L?W{46^1cZ!+Y_q@^Y(vtEHj5CI=L>ROg z^0h<)K&E zE)zISHdo%!aXuX@p4+N>cFyRUJ89$>IsSxvwZW2Fjif&Jv)Glw=IMt`l^k`js>>Wx z8FBLd%{(ZEP@6z?Y=4cjo>Hx%Lpos{+g~1S=VV>?iw1n^*b(}<)uCU63AStgdG+Bu zM>638qj#6D%FblnCBmv(g2-%rEJrtjRF@pV{P`EV1&<{61d%;|fJw_Vl+tej9Hd0> zLUYo4odlHJPO3%k(mRWF6*{1CFc2=Lk+*DzWhm8!Uf9hoX2R~i zvw4MoX@dVyug;DTMRx1pe3%8WY2pDZ?K-wT(NB8sEkhcqFa$<$Ea|VZ^nq84!Nmf5 zrdtb{C1XGV>4gz(BFsROK7cop6{l}%C}B4E+d^jz5U20gMHuG;d%HbHmOO5GTrw=5 z-*c|}{|BPGS;-R*ID53Lo|+|#)UZ%3hRc}xIH^@m=Sny6neFmd0h~z3DN*|A^}#x= z5;Z|IzXlsrTMY0ub0{I3Hk_*wCxG z=FbBtwpR{k-aC)`<&(A~PnYCyO_~I%HUu)`8b5v|bP|f}BWxsh=_s6pOcF8cZul8v z5}cL<05#lw)6W*Ev}e#%)d=u93ZOoT;#FVx5kTo8w4(X&4|88NJ*8z1X5IGxz_v)$ zjq!GLyG#wF{Dk&!_DjGxHjON3g(e32e#Y}4msYuO`RHu=MyV`2>o>wPP}~H5E5h z%qwV>8i;r%#t*l52Cd|dK4c{skUeQ2+HV%+h+BKg_eb5_Tz-ehb^o;SoTI9k$0x0y zF))4%aIACI$I}X3u7v8_hq}9jdZ@YG_n@av2~ literal 0 HcmV?d00001 diff --git a/icon/mstile-70x70.png b/icon/mstile-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..2320660218da33a0070fe9d4c786dfaaa9d83f1e GIT binary patch literal 1728 zcmcgs`#alt7XEZHWlAY+46W8umr`VNVN|NyYN*SIN>P?Eb&K0nX(!sUT8b7Gw2F!i zty^cbTEnzF%`&r9jLSDd5|ZT`s8b+-Ls^_Bo37x2WLDXlJ}L08NFOim=@(ZXDr$0S`cm1pw(;0LWCS z^aTKtkO1&Q0l=04pr1&k5u5<{;!7VdKUYSzVTucR+kLi{K6 zrN_OCh)1lw8FY<1P*DBE&d$!p*0wWsRPzqxSv)B<#gaWAczzCf(@%AY*Q0V0Qh;{XzX4M(5O8_q6z6 z4g-E~;Oz%d`{b(Ly#bvpdIM{@l_NZGci<^~=_Px)_>YAeh9LXh9JQaHN}DO_Ubyml zI;!!LQn{1X#tVKvq1aX?wQ>n{<6ClNT=UeoRh)=dA6+ZQ#9Ipaw(`_JM@15aRIc=? z{cxgeWO+mGS;et09bOd6)})HF6{E;Utl8DA6Vhkb^|KirpVqdO%JzxX#^IGWW5ULf6`4XA@biRlQ+~31WM3wo(zm!E zmhso+W(7m&61H^_OE+tv30AGz2VhFN;Oz^5#_^!M)?tBC(;+O3SM;E2f= z9FtsPoq+=psm|KgHr@(uIivSo?Ni-`1BvWh*kQ}+jNne&mE8zGm#+5K>Yduh+CBC{ zX4uE`sj?NZ`HkLo!^7EG&e}D-m#1HTbMnD2;|*b#$4~8&1MbuI{QDa&c~CWieo66o)?;DTR%@C-Nw*g+vK2V{^hB`YMGZR z9`W^=P<0pCdzX}Wk4;O*nj`-1iRllbc%`#(9XB5Y9cw|`1d%Hu%&O)4d?07MS{YRJ9{ywPnK?`UR#|~w zw>#{Q5-2p{>wBn9X6_@;IrgFr4!Swrgo!Tk5^~EZk@r2`)V6C9NR&a8&-a#V*x>Xp1s=bW5AH!QYWsX5p zZQxgRtqp2(xaLQ=61Ng4GrO>Q$bfvxC@rJ-`kgobKBI`uE=v9ewb~}>>JMlfS2Ob; z@BAVYaYH9fTw3m%DJ)70eGwi07N>tHeL#W_Of~R*Oc@?% z_PNzj%(%qSiALHY zF}7$2Ka@Sz9)-oAt&vD95_#vjCicGs@d=T!QOW-!uye#>F#i!`agM2}1P4D)@J)y! o-3Yrz1kRBO;Y4GP_^@c=1!7oa^3`7A=Qjd8T)kahoej + + + + LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + +
+
+
+
  • Safe Rendering

    Liquid templates are highly readable and fault-tolerant thus suitable for designers and customers. Operators and expressions are parsed to AST and no eval or new Function are used.

  • Zero Dependency

    Written with zero npm dependency and no native binding, available in both Node.js and browsers. All of the CMD, ESM and CJS bundles are available on CDN.

  • Shopify Compatible

    All filters and tags from Ruby shopify/liquid are supported by LiquidJS. Jekyll sites, Github Pages and Shopify templates can be ported to Node.js without pain.

  • TypeScript Strict

    The whole repo is re-written in TypeScript strict mode to ensure a smooth experience using this lib and the document is precise and always up to date.

+
    +
  • import { Liquid } from 'liquidjs'
  • +
  • const engine = new Liquid()
  • +
  • const tpl = engine.parse('Welcome to {{v}}!')
  • +
  • engine.render(tpl, {v: "Liquid"}).then(console.log)
  • +
  • // Outputs "Welcome to Liquid!"
  • +
+ +
+
+
+
+
+
+

Contributors

+

LiquidJS follows the all-contributors specification, see guildelines here! Thanks goes to these wonderful people:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jun YangchenosZach LeathermanTim HardyPaul Robert LloydAlec LarsonPatrick Malouinjaswrks三三ssendevwojtask9Andrew BarclayCory MawhorterMehdi JafferyRobin BijlaniRyan KennedySami KukkonenScott SantucciSteven azuJoonasJamel A.Brandon PittmantgrandgentMartin SchusterRayCristofer GonzalesRaymond CamdenSteve StedmanAnthony CiccarelloBogdan ChadkinTejas ManoharPeter deHaanamit777Steffen SchuldenzuckerPixcellJason EtcovitchZCMemmie Lenglet
+ + + + + +
+
+
+
+
+
+
+

Backers

+

Love LiquidJS and want to contribute? Become a backer. Find out more how to contribute!

+
+ +
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 000000000..4bdebe6ca --- /dev/null +++ b/js/main.js @@ -0,0 +1,121 @@ +(function() { + // mobile nav + // var body = document.getElementsByTagName('body')[0]; + var html = document.getElementsByTagName('html')[0]; + var navToggle = document.getElementById('mobile-nav-toggle'); + var dimmer = document.getElementById('mobile-nav-dimmer'); + var CLASS_NAME = 'mobile-nav-on'; + if (!navToggle) return; + + navToggle.addEventListener('click', function(e) { + e.preventDefault(); + e.stopPropagation(); + // body.classList.toggle(CLASS_NAME); + html.classList.toggle(CLASS_NAME); + }); + + dimmer.addEventListener('click', function(e) { + if (!html.classList.contains(CLASS_NAME)) return; + + e.preventDefault(); + html.classList.remove(CLASS_NAME); + }); +}()); + +(function() { + // article toc + var tocList = document.getElementById('article-toc-inner-list'); + if (!tocList) return; + + window.addEventListener('resize', setMaxHeight); + setMaxHeight(); + + function setMaxHeight() { + var maxHeight = window.innerHeight - 45; + tocList.style['max-height'] = maxHeight + 'px'; + } +}()); + +(function() { + // lang select + function changeLang() { + var lang = this.value; + var canonical = this.dataset.canonical; + var path = '/'; + if (lang !== 'en') path += lang + '/'; + + var expires = new Date(); + expires.setFullYear(expires.getFullYear() + 1); + document.cookie = 'nf_lang=' + lang + ';path=/;expires=' + expires.toGMTString(); + + location.href = path + canonical; + } + + document.getElementById('lang-select').addEventListener('change', changeLang); + document.getElementById('mobile-lang-select').addEventListener('change', changeLang); +}()); + +(function() { + // playground + /* global liquidjs, sourceEl, ace */ + if (!location.pathname.match(/playground.html$/)) return; + const engine = new liquidjs.Liquid(); + const editor = createEditor('editorEl', 'liquid'); + const preview = createEditor('previewEl', 'html'); + preview.setReadOnly(true); + preview.renderer.setShowGutter(false); + preview.renderer.setPadding(20); + + editor.setValue(getInitialValue(), 1); + editor.on('change', update); + update(); + + function createEditor(id, lang) { + var editor = ace.edit(id); + editor.setTheme('ace/theme/tomorrow_night'); + editor.getSession().setMode('ace/mode/' + lang); + editor.getSession().setOptions({ + tabSize: 2, + useSoftTabs: true + }); + editor.renderer.setScrollMargin(15); + return editor; + } + + function getInitialValue() { + try { + return atou(location.hash.slice(1)) || sourceEl.textContent + } catch (e) {} + return sourceEl.textContent + } + + async function update() { + const tpl = editor.getValue(); + history.replaceState({}, '', '#' + utoa(tpl)); + try { + const html = await engine.parseAndRender(tpl); + preview.setValue(html, 1); + } catch (err) { + preview.setValue(err.stack, 1); + throw err; + } + } + + function atou(str) { + return decodeURIComponent(escape(atob(str))) + } + + function utoa(str) { + return btoa(unescape(encodeURIComponent(str))) + } +}()); + +if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register('/sw.js').then(function(reg) { + console.log('ServiceWorker registration successful with scope: ', reg.scope); + }).catch(function(err) { + console.log('ServiceWorker registration failed: ', err); + }); + }); +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 000000000..1dcee7a2f --- /dev/null +++ b/manifest.json @@ -0,0 +1 @@ +{"short_name":"LiquidJS","name":"LiquidJS","icons":[{"src":"/icon/apple-touch-icon-57x57.png","type":"image/png","sizes":"57x57"},{"src":"/icon/favicon-96x96.png","type":"image/png","sizes":"96x96"},{"src":"/icon/favicon-196x196.png","type":"image/png","sizes":"196x196"},{"src":"/icon/apple-touch-icon.png","type":"image/png","sizes":"512x512"}],"start_url":"/","display":"standalone","theme_color":"#0f83ce","background_color":"#0f83ce"} \ No newline at end of file diff --git a/playground.html b/playground.html new file mode 100644 index 000000000..94cb55b4f --- /dev/null +++ b/playground.html @@ -0,0 +1,149 @@ + + + + + LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+

Playground

+
+
Loading...
+
Loading...
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..4f9540ba3 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +User-agent: * \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..ce6862318 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3497 @@ + + + + + https://liquidjs.com/zh-cn/api/globals + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_strftime_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_strftime_.timezonedate + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/parser_tokenizer_.tokenizer + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/liquid_.liquid + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_operator_trie_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_error_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_collection_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_assert_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_value_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_tag_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_range_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_quoted_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_number_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_literal_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_identifier_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_html_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_filter_token_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_template_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_tag_tag_impl_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_tag_hash_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_filter_filter_impl_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/render_operator_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/render_emitter_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_token_kind_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_parse_string_literal_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/liquid_options_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/liquid_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_forloop_drop_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_empty_drop_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_drop_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_comparable_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_blank_drop_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/context_context_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/context_block_mode_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/cache_lru_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_raw_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/cache_cache_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_unless_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_render_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_for_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_continue_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_case_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_break_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_block_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_assign_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_url_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_string_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_index_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_date_ + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/util_strftime_.formatoptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/util_operator_trie_.trie + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/util_async_.thenable + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/template_template_.template + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/template_tag_tag_impl_options_.tagimploptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/template_tag_tag_impl_.tagimpl + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/template_filter_filter_impl_options_.filterimploptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/template_filter_filter_impl_.filterimpl + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/render_operator_.operators + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/liquid_options_.normalizedoptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/liquid_options_.normalizedfulloptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/liquid_options_.liquidoptions + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/fs_fs_.fs + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/drop_comparable_.comparable + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/context_scope_.plainobject + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/interfaces/cache_cache_.cache + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/enums/parser_token_kind_.tokenkind + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/enums/context_block_mode_.blockmode + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.undefinedvariableerror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.tokenizationerror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.rendererror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.parseerror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.liquiderror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.internalundefinedvariableerror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/util_error_.assertionerror + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_token_.token + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_tag_token_.tagtoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_range_token_.rangetoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_quoted_token_.quotedtoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_property_access_token_.propertyaccesstoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_output_token_.outputtoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_operator_token_.operatortoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_number_token_.numbertoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_literal_token_.literaltoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_identifier_token_.identifiertoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_html_token_.htmltoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_hash_token_.hashtoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_filter_token_.filtertoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/tokens_delimited_token_.delimitedtoken + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_value_.value + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_template_impl_.templateimpl + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_tag_tag_map_.tagmap + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_tag_tag_.tag + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_tag_hash_.hash + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_output_.output + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_html_.html + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_filter_filter_map_.filtermap + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/template_filter_filter_.filter + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/render_render_.render + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/render_expression_.expression + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/render_emitter_.emitter + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/parser_parser_.parser + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/parser_parse_stream_.parsestream + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_tablerowloop_drop_.tablerowloopdrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_null_drop_.nulldrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_forloop_drop_.forloopdrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_empty_drop_.emptydrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_drop_.drop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_block_drop_.blockdrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/drop_blank_drop_.blankdrop + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/context_context_.context + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/cache_lru_.node + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/classes/cache_lru_.lru + + 2021-05-09T12:19:10.952Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_block_drop_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_tokenizer_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_underscore_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_whitespace_ctrl_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_parse_stream_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_match_operator_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_filter_arg_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/render_boolean_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/render_expression_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/fs_node_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/fs_fs_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/fs_browser_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_tablerowloop_drop_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/drop_null_drop_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/render_render_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/api/globals + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_array_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_type_guards_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_html_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_literal_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_math_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_filters_object_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_character_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/util_async_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/types_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_toplevel_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_property_access_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_capture_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_output_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_comment_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_operator_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/api/interfaces/util_async_.thenable + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_cycle_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_decrement_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_filter_filter_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_filter_filter_impl_options_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_filter_filter_map_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/parser_parser_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_html_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/context_scope_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_output_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_tag_tag_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_tag_tag_impl_options_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_tag_tag_map_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_template_impl_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/template_value_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_tablerow_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_delimited_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_layout_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_index_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_increment_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_include_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/builtin_tags_if_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/zh-cn/api/modules/tokens_hash_token_ + + 2021-05-09T12:19:10.948Z + + + + + https://liquidjs.com/api/interfaces/template_tag_tag_impl_options_.tagimploptions + + 2021-05-09T12:19:10.944Z + + + + + https://liquidjs.com/api/interfaces/template_tag_tag_impl_.tagimpl + + 2021-05-09T12:19:10.940Z + + + + + https://liquidjs.com/api/interfaces/fs_fs_.fs + + 2021-05-09T12:19:10.940Z + + + + + https://liquidjs.com/api/interfaces/liquid_options_.liquidoptions + + 2021-05-09T12:19:10.936Z + + + + + https://liquidjs.com/api/interfaces/template_template_.template + + 2021-05-09T12:19:10.936Z + + + + + https://liquidjs.com/api/interfaces/cache_cache_.cache + + 2021-05-09T12:19:10.932Z + + + + + https://liquidjs.com/api/interfaces/render_operator_.operators + + 2021-05-09T12:19:10.932Z + + + + + https://liquidjs.com/api/interfaces/liquid_options_.normalizedoptions + + 2021-05-09T12:19:10.928Z + + + + + https://liquidjs.com/api/interfaces/liquid_options_.normalizedfulloptions + + 2021-05-09T12:19:10.928Z + + + + + https://liquidjs.com/api/interfaces/context_scope_.plainobject + + 2021-05-09T12:19:10.924Z + + + + + https://liquidjs.com/api/interfaces/util_operator_trie_.trie + + 2021-05-09T12:19:10.920Z + + + + + https://liquidjs.com/api/interfaces/util_strftime_.formatoptions + + 2021-05-09T12:19:10.920Z + + + + + https://liquidjs.com/api/interfaces/template_filter_filter_impl_.filterimpl + + 2021-05-09T12:19:10.916Z + + + + + https://liquidjs.com/api/interfaces/template_filter_filter_impl_options_.filterimploptions + + 2021-05-09T12:19:10.916Z + + + + + https://liquidjs.com/api/interfaces/drop_comparable_.comparable + + 2021-05-09T12:19:10.912Z + + + + + https://liquidjs.com/api/enums/parser_token_kind_.tokenkind + + 2021-05-09T12:19:10.912Z + + + + + https://liquidjs.com/api/enums/context_block_mode_.blockmode + + 2021-05-09T12:19:10.908Z + + + + + https://liquidjs.com/api/classes/template_filter_filter_.filter + + 2021-05-09T12:19:10.908Z + + + + + https://liquidjs.com/api/classes/util_error_.undefinedvariableerror + + 2021-05-09T12:19:10.904Z + + + + + https://liquidjs.com/api/classes/tokens_operator_token_.operatortoken + + 2021-05-09T12:19:10.904Z + + + + + https://liquidjs.com/api/classes/tokens_identifier_token_.identifiertoken + + 2021-05-09T12:19:10.900Z + + + + + https://liquidjs.com/api/classes/template_tag_tag_.tag + + 2021-05-09T12:19:10.896Z + + + + + https://liquidjs.com/api/classes/tokens_html_token_.htmltoken + + 2021-05-09T12:19:10.896Z + + + + + https://liquidjs.com/api/classes/template_tag_hash_.hash + + 2021-05-09T12:19:10.892Z + + + + + https://liquidjs.com/api/classes/util_error_.liquiderror + + 2021-05-09T12:19:10.892Z + + + + + https://liquidjs.com/api/classes/template_value_.value + + 2021-05-09T12:19:10.888Z + + + + + https://liquidjs.com/api/classes/tokens_token_.token + + 2021-05-09T12:19:10.888Z + + + + + https://liquidjs.com/api/classes/tokens_literal_token_.literaltoken + + 2021-05-09T12:19:10.884Z + + + + + https://liquidjs.com/api/classes/template_output_.output + + 2021-05-09T12:19:10.880Z + + + + + https://liquidjs.com/api/classes/parser_parser_.parser + + 2021-05-09T12:19:10.880Z + + + + + https://liquidjs.com/api/classes/drop_block_drop_.blockdrop + + 2021-05-09T12:19:10.876Z + + + + + https://liquidjs.com/api/classes/template_tag_tag_map_.tagmap + + 2021-05-09T12:19:10.876Z + + + + + https://liquidjs.com/api/classes/liquid_.liquid + + 2021-05-09T12:19:10.872Z + + + + + https://liquidjs.com/api/classes/util_error_.parseerror + + 2021-05-09T12:19:10.868Z + + + + + https://liquidjs.com/api/classes/template_html_.html + + 2021-05-09T12:19:10.868Z + + + + + https://liquidjs.com/api/classes/cache_lru_.lru + + 2021-05-09T12:19:10.864Z + + + + + https://liquidjs.com/api/classes/tokens_filter_token_.filtertoken + + 2021-05-09T12:19:10.864Z + + + + + https://liquidjs.com/api/classes/drop_forloop_drop_.forloopdrop + + 2021-05-09T12:19:10.860Z + + + + + https://liquidjs.com/api/classes/render_expression_.expression + + 2021-05-09T12:19:10.856Z + + + + + https://liquidjs.com/api/classes/parser_tokenizer_.tokenizer + + 2021-05-09T12:19:10.856Z + + + + + https://liquidjs.com/api/classes/util_error_.tokenizationerror + + 2021-05-09T12:19:10.852Z + + + + + https://liquidjs.com/api/classes/render_render_.render + + 2021-05-09T12:19:10.848Z + + + + + https://liquidjs.com/api/classes/drop_tablerowloop_drop_.tablerowloopdrop + + 2021-05-09T12:19:10.848Z + + + + + https://liquidjs.com/api/classes/template_filter_filter_map_.filtermap + + 2021-05-09T12:19:10.844Z + + + + + https://liquidjs.com/api/classes/render_emitter_.emitter + + 2021-05-09T12:19:10.844Z + + + + + https://liquidjs.com/api/classes/context_context_.context + + 2021-05-09T12:19:10.840Z + + + + + https://liquidjs.com/api/classes/util_error_.assertionerror + + 2021-05-09T12:19:10.836Z + + + + + https://liquidjs.com/api/classes/drop_blank_drop_.blankdrop + + 2021-05-09T12:19:10.836Z + + + + + https://liquidjs.com/api/classes/drop_drop_.drop + + 2021-05-09T12:19:10.832Z + + + + + https://liquidjs.com/api/classes/tokens_range_token_.rangetoken + + 2021-05-09T12:19:10.832Z + + + + + https://liquidjs.com/api/classes/tokens_quoted_token_.quotedtoken + + 2021-05-09T12:19:10.828Z + + + + + https://liquidjs.com/api/classes/tokens_output_token_.outputtoken + + 2021-05-09T12:19:10.828Z + + + + + https://liquidjs.com/api/classes/cache_lru_.node + + 2021-05-09T12:19:10.824Z + + + + + https://liquidjs.com/api/classes/util_error_.internalundefinedvariableerror + + 2021-05-09T12:19:10.824Z + + + + + https://liquidjs.com/api/classes/tokens_hash_token_.hashtoken + + 2021-05-09T12:19:10.820Z + + + + + https://liquidjs.com/api/classes/template_template_impl_.templateimpl + + 2021-05-09T12:19:10.816Z + + + + + https://liquidjs.com/api/classes/parser_parse_stream_.parsestream + + 2021-05-09T12:19:10.816Z + + + + + https://liquidjs.com/api/classes/tokens_tag_token_.tagtoken + + 2021-05-09T12:19:10.812Z + + + + + https://liquidjs.com/api/classes/drop_null_drop_.nulldrop + + 2021-05-09T12:19:10.812Z + + + + + https://liquidjs.com/api/classes/util_strftime_.timezonedate + + 2021-05-09T12:19:10.808Z + + + + + https://liquidjs.com/api/classes/tokens_delimited_token_.delimitedtoken + + 2021-05-09T12:19:10.804Z + + + + + https://liquidjs.com/api/classes/drop_empty_drop_.emptydrop + + 2021-05-09T12:19:10.800Z + + + + + https://liquidjs.com/api/classes/tokens_property_access_token_.propertyaccesstoken + + 2021-05-09T12:19:10.800Z + + + + + https://liquidjs.com/api/classes/tokens_number_token_.numbertoken + + 2021-05-09T12:19:10.796Z + + + + + https://liquidjs.com/api/classes/util_error_.rendererror + + 2021-05-09T12:19:10.796Z + + + + + https://liquidjs.com/api/modules/drop_blank_drop_ + + 2021-05-09T12:19:10.792Z + + + + + https://liquidjs.com/api/modules/tokens_hash_token_ + + 2021-05-09T12:19:10.792Z + + + + + https://liquidjs.com/api/modules/parser_parser_ + + 2021-05-09T12:19:10.788Z + + + + + https://liquidjs.com/api/modules/render_render_ + + 2021-05-09T12:19:10.788Z + + + + + https://liquidjs.com/api/modules/drop_block_drop_ + + 2021-05-09T12:19:10.784Z + + + + + https://liquidjs.com/api/modules/drop_comparable_ + + 2021-05-09T12:19:10.784Z + + + + + https://liquidjs.com/api/modules/fs_fs_ + + 2021-05-09T12:19:10.780Z + + + + + https://liquidjs.com/api/modules/template_output_ + + 2021-05-09T12:19:10.780Z + + + + + https://liquidjs.com/api/modules/render_operator_ + + 2021-05-09T12:19:10.776Z + + + + + https://liquidjs.com/api/modules/builtin_tags_unless_ + + 2021-05-09T12:19:10.776Z + + + + + https://liquidjs.com/api/modules/context_scope_ + + 2021-05-09T12:19:10.772Z + + + + + https://liquidjs.com/api/modules/template_tag_tag_ + + 2021-05-09T12:19:10.772Z + + + + + https://liquidjs.com/api/modules/util_type_guards_ + + 2021-05-09T12:19:10.768Z + + + + + https://liquidjs.com/api/modules/context_block_mode_ + + 2021-05-09T12:19:10.768Z + + + + + https://liquidjs.com/api/modules/drop_empty_drop_ + + 2021-05-09T12:19:10.764Z + + + + + https://liquidjs.com/api/modules/util_assert_ + + 2021-05-09T12:19:10.764Z + + + + + https://liquidjs.com/api/modules/builtin_tags_raw_ + + 2021-05-09T12:19:10.760Z + + + + + https://liquidjs.com/api/modules/tokens_output_token_ + + 2021-05-09T12:19:10.760Z + + + + + https://liquidjs.com/api/modules/util_strftime_ + + 2021-05-09T12:19:10.756Z + + + + + https://liquidjs.com/api/modules/util_operator_trie_ + + 2021-05-09T12:19:10.756Z + + + + + https://liquidjs.com/api/modules/parser_tokenizer_ + + 2021-05-09T12:19:10.752Z + + + + + https://liquidjs.com/api/modules/builtin_filters_index_ + + 2021-05-09T12:19:10.748Z + + + + + https://liquidjs.com/api/modules/template_template_impl_ + + 2021-05-09T12:19:10.748Z + + + + + https://liquidjs.com/api/modules/template_value_ + + 2021-05-09T12:19:10.744Z + + + + + https://liquidjs.com/api/modules/parser_token_kind_ + + 2021-05-09T12:19:10.744Z + + + + + https://liquidjs.com/api/modules/tokens_range_token_ + + 2021-05-09T12:19:10.740Z + + + + + https://liquidjs.com/api/modules/context_context_ + + 2021-05-09T12:19:10.740Z + + + + + https://liquidjs.com/api/modules/tokens_number_token_ + + 2021-05-09T12:19:10.736Z + + + + + https://liquidjs.com/api/modules/tokens_tag_token_ + + 2021-05-09T12:19:10.736Z + + + + + https://liquidjs.com/api/modules/parser_match_operator_ + + 2021-05-09T12:19:10.732Z + + + + + https://liquidjs.com/api/modules/template_tag_tag_impl_options_ + + 2021-05-09T12:19:10.732Z + + + + + https://liquidjs.com/api/modules/builtin_tags_render_ + + 2021-05-09T12:19:10.728Z + + + + + https://liquidjs.com/api/modules/parser_filter_arg_ + + 2021-05-09T12:19:10.728Z + + + + + https://liquidjs.com/api/modules/parser_parse_stream_ + + 2021-05-09T12:19:10.724Z + + + + + https://liquidjs.com/api/modules/template_filter_filter_ + + 2021-05-09T12:19:10.724Z + + + + + https://liquidjs.com/api/modules/tokens_property_access_token_ + + 2021-05-09T12:19:10.720Z + + + + + https://liquidjs.com/api/modules/render_emitter_ + + 2021-05-09T12:19:10.720Z + + + + + https://liquidjs.com/api/modules/drop_forloop_drop_ + + 2021-05-09T12:19:10.720Z + + + + + https://liquidjs.com/api/modules/builtin_filters_url_ + + 2021-05-09T12:19:10.716Z + + + + + https://liquidjs.com/api/modules/tokens_operator_token_ + + 2021-05-09T12:19:10.716Z + + + + + https://liquidjs.com/api/modules/builtin_tags_index_ + + 2021-05-09T12:19:10.712Z + + + + + https://liquidjs.com/api/modules/tokens_delimited_token_ + + 2021-05-09T12:19:10.704Z + + + + + https://liquidjs.com/api/modules/builtin_filters_date_ + + 2021-05-09T12:19:10.704Z + + + + + https://liquidjs.com/api/modules/liquid_ + + 2021-05-09T12:19:10.700Z + + + + + https://liquidjs.com/api/modules/tokens_identifier_token_ + + 2021-05-09T12:19:10.700Z + + + + + https://liquidjs.com/api/modules/tokens_quoted_token_ + + 2021-05-09T12:19:10.696Z + + + + + https://liquidjs.com/api/modules/template_tag_tag_map_ + + 2021-05-09T12:19:10.696Z + + + + + https://liquidjs.com/api/modules/template_filter_filter_impl_options_ + + 2021-05-09T12:19:10.692Z + + + + + https://liquidjs.com/api/modules/builtin_filters_string_ + + 2021-05-09T12:19:10.692Z + + + + + https://liquidjs.com/api/modules/render_boolean_ + + 2021-05-09T12:19:10.688Z + + + + + https://liquidjs.com/api/modules/builtin_tags_block_ + + 2021-05-09T12:19:10.688Z + + + + + https://liquidjs.com/api/modules/util_error_ + + 2021-05-09T12:19:10.684Z + + + + + https://liquidjs.com/api/modules/parser_parse_string_literal_ + + 2021-05-09T12:19:10.684Z + + + + + https://liquidjs.com/api/modules/template_tag_hash_ + + 2021-05-09T12:19:10.680Z + + + + + https://liquidjs.com/api/modules/tokens_literal_token_ + + 2021-05-09T12:19:10.680Z + + + + + https://liquidjs.com/api/modules/builtin_tags_decrement_ + + 2021-05-09T12:19:10.676Z + + + + + https://liquidjs.com/api/modules/util_underscore_ + + 2021-05-09T12:19:10.676Z + + + + + https://liquidjs.com/api/modules/tokens_token_ + + 2021-05-09T12:19:10.672Z + + + + + https://liquidjs.com/api/modules/drop_drop_ + + 2021-05-09T12:19:10.672Z + + + + + https://liquidjs.com/api/modules/tokens_value_token_ + + 2021-05-09T12:19:10.668Z + + + + + https://liquidjs.com/api/modules/template_template_ + + 2021-05-09T12:19:10.668Z + + + + + https://liquidjs.com/api/modules/tokens_filter_token_ + + 2021-05-09T12:19:10.664Z + + + + + https://liquidjs.com/api/modules/util_collection_ + + 2021-05-09T12:19:10.664Z + + + + + https://liquidjs.com/api/modules/types_ + + 2021-05-09T12:19:10.660Z + + + + + https://liquidjs.com/api/modules/tokens_html_token_ + + 2021-05-09T12:19:10.660Z + + + + + https://liquidjs.com/api/modules/builtin_tags_if_ + + 2021-05-09T12:19:10.656Z + + + + + https://liquidjs.com/api/modules/builtin_tags_cycle_ + + 2021-05-09T12:19:10.656Z + + + + + https://liquidjs.com/api/modules/template_filter_filter_impl_ + + 2021-05-09T12:19:10.652Z + + + + + https://liquidjs.com/api/modules/cache_lru_ + + 2021-05-09T12:19:10.652Z + + + + + https://liquidjs.com/api/modules/builtin_tags_break_ + + 2021-05-09T12:19:10.648Z + + + + + https://liquidjs.com/api/modules/util_character_ + + 2021-05-09T12:19:10.648Z + + + + + https://liquidjs.com/api/modules/builtin_tags_continue_ + + 2021-05-09T12:19:10.644Z + + + + + https://liquidjs.com/api/modules/template_filter_filter_map_ + + 2021-05-09T12:19:10.644Z + + + + + https://liquidjs.com/api/modules/util_literal_ + + 2021-05-09T12:19:10.640Z + + + + + https://liquidjs.com/api/modules/template_tag_tag_impl_ + + 2021-05-09T12:19:10.640Z + + + + + https://liquidjs.com/api/modules/builtin_filters_array_ + + 2021-05-09T12:19:10.636Z + + + + + https://liquidjs.com/api/modules/drop_null_drop_ + + 2021-05-09T12:19:10.636Z + + + + + https://liquidjs.com/api/modules/builtin_tags_layout_ + + 2021-05-09T12:19:10.632Z + + + + + https://liquidjs.com/api/modules/fs_browser_ + + 2021-05-09T12:19:10.632Z + + + + + https://liquidjs.com/api/modules/builtin_tags_increment_ + + 2021-05-09T12:19:10.628Z + + + + + https://liquidjs.com/api/modules/builtin_filters_object_ + + 2021-05-09T12:19:10.628Z + + + + + https://liquidjs.com/api/modules/parser_whitespace_ctrl_ + + 2021-05-09T12:19:10.624Z + + + + + https://liquidjs.com/api/modules/cache_cache_ + + 2021-05-09T12:19:10.624Z + + + + + https://liquidjs.com/api/modules/builtin_tags_case_ + + 2021-05-09T12:19:10.620Z + + + + + https://liquidjs.com/api/modules/render_expression_ + + 2021-05-09T12:19:10.620Z + + + + + https://liquidjs.com/api/modules/builtin_tags_capture_ + + 2021-05-09T12:19:10.616Z + + + + + https://liquidjs.com/api/modules/drop_tablerowloop_drop_ + + 2021-05-09T12:19:10.616Z + + + + + https://liquidjs.com/api/modules/liquid_options_ + + 2021-05-09T12:19:10.612Z + + + + + https://liquidjs.com/api/modules/builtin_filters_html_ + + 2021-05-09T12:19:10.608Z + + + + + https://liquidjs.com/api/modules/util_async_ + + 2021-05-09T12:19:10.608Z + + + + + https://liquidjs.com/api/modules/template_html_ + + 2021-05-09T12:19:10.604Z + + + + + https://liquidjs.com/api/modules/builtin_tags_assign_ + + 2021-05-09T12:19:10.604Z + + + + + https://liquidjs.com/api/modules/builtin_tags_for_ + + 2021-05-09T12:19:10.600Z + + + + + https://liquidjs.com/api/modules/tokens_toplevel_token_ + + 2021-05-09T12:19:10.600Z + + + + + https://liquidjs.com/api/modules/builtin_tags_tablerow_ + + 2021-05-09T12:19:10.596Z + + + + + https://liquidjs.com/api/modules/builtin_tags_include_ + + 2021-05-09T12:19:10.596Z + + + + + https://liquidjs.com/api/modules/builtin_tags_comment_ + + 2021-05-09T12:19:10.592Z + + + + + https://liquidjs.com/api/modules/fs_node_ + + 2021-05-09T12:19:10.592Z + + + + + https://liquidjs.com/api/modules/builtin_filters_math_ + + 2021-05-09T12:19:10.588Z + + + + + https://liquidjs.com/ + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/abs + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/append + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/at_least + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/at_most + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/capitalize + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/ceil + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/compact + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/concat + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/date + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/default + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/divided_by + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/downcase + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/escape + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/escape_once + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/first + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/floor + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/join + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/json + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/last + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/lstrip + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/map + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/minus + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/modulo + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/newline_to_br + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/overview + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/plus + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/prepend + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/remove + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/remove_first + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/playground + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/replace + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/playground + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/ + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/whitespace-control + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/use-in-expressjs + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/truthy-and-falsy + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/setup + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/render-file + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/register-filters-tags + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/plugins + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/partials-and-layouts + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/options + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/operators + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/migrate-to-9 + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/intro-to-liquid + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/differences + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/contribution-guidelines + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tutorials/caching + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/unless + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/tablerow + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/render + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/raw + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/overview + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/layout + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/increment + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/include + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/if + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/for + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/decrement + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/cycle + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/comment + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/case + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/capture + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/tags/assign + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/replace_first + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/reverse + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/round + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/rstrip + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/size + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/slice + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/sort + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/sort_natural + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/split + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/strip + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/strip_html + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/strip_newlines + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/times + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/truncate + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/truncatewords + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/uniq + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/upcase + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/url_decode + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/url_encode + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/filters/where + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/capture + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/assign + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/case + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/comment + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/cycle + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/manifest.json + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/for + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/if + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/include + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/increment + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/layout + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/overview + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/raw + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/render + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/tablerow + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/unless + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/caching + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/contribution-guidelines + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/differences + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/intro-to-liquid + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/migrate-to-9 + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/operators + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/options + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/partials-and-layouts + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/plugins + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/register-filters-tags + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/render-file + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/setup + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/truthy-and-falsy + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/use-in-expressjs + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tutorials/whitespace-control + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/zh-cn/tags/decrement + + 2021-05-09T12:18:44.949Z + + + + + https://liquidjs.com/filters/minus + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/newline_to_br + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/map + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/overview + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/lstrip + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/plus + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/prepend + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/last + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/remove + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/remove_first + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/replace + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/replace_first + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/json + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/reverse + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/join + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/round + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/rstrip + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/floor + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/size + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/split + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/strip + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/first + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/strip_html + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/escape_once + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/modulo + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/downcase + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/divided_by + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/strip_newlines + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/times + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/truncate + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/default + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/date + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/concat + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/compact + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/truncatewords + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/ceil + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/uniq + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/capitalize + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/upcase + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/url_decode + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/at_most + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/at_least + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/url_encode + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/append + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/where + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/abs + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/slice + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/sort + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/sort_natural + + 2021-05-09T12:18:44.945Z + + + + + https://liquidjs.com/filters/escape + + 2021-05-09T12:18:44.945Z + + + + diff --git a/sw.js b/sw.js new file mode 100644 index 000000000..498ddc091 --- /dev/null +++ b/sw.js @@ -0,0 +1,58 @@ +'use strict' + +const CACHE_NAME = '' +const urlsToCache = [ + '/', + '/css/navy.css', + '/js/main.js', + '/icon/logo.png', + '/fonts/icomoon.ttf?e8nnma' +] +const blackList = [ + /google-analytics.com.*collect/ +] + +self.addEventListener('install', event => { + event.waitUntil(caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache))) +}) + +self.addEventListener('activate', event => { + event.waitUntil(caches.keys().then(cacheNames => Promise.all( + cacheNames.map(cacheName => cacheName !== CACHE_NAME && caches.delete(cacheName)) + ))) +}) + +self.addEventListener('fetch', event => { + if ( + event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin' + ) return cache(event.request) + if ( + event.request.method !== 'GET' || blackList.some(regex => regex.exec(event.request.url)) + ) return network(event.request) + const pn = networkAndSave(event.request) + event.respondWith(cache(event.request).then(res => res || pn).catch(() => pn)) +}) + +function cache (req) { + return caches.open(CACHE_NAME).then(cache => cache.match(req.clone())) +} + +function networkAndSave (req) { + return network(req).then(res => { + if (validate(res)) save(req.clone(), res.clone()) + return res + }) +} + +function network (req) { + return fetch(req.clone()) +} + +function save (key, val) { + return caches.open(CACHE_NAME).then(cache => cache.put(key, val)) +} + +function validate (res) { + if (res && res.type === 'basic' && res.status !== 200) return false + return true +} diff --git a/tags/assign.html b/tags/assign.html new file mode 100644 index 000000000..be6bb3578 --- /dev/null +++ b/tags/assign.html @@ -0,0 +1,191 @@ + + + + + Assign | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Assign

+ + + +
+
+

Added in: v1.9.1

+ +

Creates a new variable.

+

Input

+
{% assign my_variable = false %}
{% if my_variable != true %}
This statement is valid.
{% endif %}
+ +

Output

+
This statement is valid.
+ +

Wrap a variable value in quotations " to save it as a string.

+

Input

+
{% assign foo = "bar" %}
{{ foo }}
+ +

Output

+
bar
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/capture.html b/tags/capture.html new file mode 100644 index 000000000..57d52c137 --- /dev/null +++ b/tags/capture.html @@ -0,0 +1,191 @@ + + + + + capture | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

capture

+ + + +
+
+

Added in: v1.9.1

+ +

Captures the string inside of the opening and closing tags and assigns it to a variable. Variables created through capture are strings.

+

Input

+
{% capture my_variable %}I am being captured.{% endcapture %}
{{ my_variable }}
+ +

Output

+
I am being captured.
+ +

Using capture, you can create complex strings using other variables created with assign:

+

Input

+
{% assign favorite_food = "pizza" %}
{% assign age = 35 %}

{% capture about_me %}
I am {{ age }} and my favorite food is {{ favorite_food }}.
{% endcapture %}

{{ about_me }}
+ +

Output

+
I am 35 and my favourite food is pizza.
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/case.html b/tags/case.html new file mode 100644 index 000000000..5362e49d3 --- /dev/null +++ b/tags/case.html @@ -0,0 +1,184 @@ + + + + + case | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

case

+ + + +
+
+

Added in: v1.9.1

+ +

Creates a switch statement to compare a variable with different values. case initializes the switch statement, and when compares its values.

+

Input

+
{% assign handle = "cake" %}
{% case handle %}
{% when "cake" %}
This is a cake
{% when "cookie", "biscuit" %}
This is a cookie
{% else %}
This is not a cake nor a cookie
{% endcase %}
+ +

Output

+
This is a cake
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/comment.html b/tags/comment.html new file mode 100644 index 000000000..3269d16ed --- /dev/null +++ b/tags/comment.html @@ -0,0 +1,184 @@ + + + + + Comment | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Comment

+ + + +
+
+

Added in: v1.9.1

+ +

Allows you to leave un-rendered code inside a Liquid template. Any text within the opening and closing comment blocks will not be printed, and any Liquid code within will not be executed.

+

Input

+
Anything you put between {% comment %} and {% endcomment %} tags
is turned into a comment.
+ +

Output

+
Anything you put between  tags
is turned into a comment.
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/cycle.html b/tags/cycle.html new file mode 100644 index 000000000..e936dceba --- /dev/null +++ b/tags/cycle.html @@ -0,0 +1,196 @@ + + + + + cycle | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

cycle

+ + + +
+
+

Added in: v1.9.1

+ +

Loops through a group of strings and prints them in the order that they were passed as arguments. Each time cycle is called, the next string argument is printed.

+

Basic Usage

Input

+
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
+ +

Output

+
one
two
three
one
+ +

Uses for cycle include:

+
    +
  • applying odd/even classes to rows in a table
  • +
  • applying a unique class to the last product thumbnail in a row
  • +
+

Parameters

cycle accepts a “cycle group” parameter in cases where you need multiple cycle blocks in one template. If no name is supplied for the cycle group, then it is assumed that multiple calls with the same parameters are one group.

+

Input

+
{% cycle "first": "one", "two", "three" %}
{% cycle "second": "one", "two", "three" %}
{% cycle "second": "one", "two", "three" %}
{% cycle "first": "one", "two", "three" %}
+ +

Output

+
one
one
two
two
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/decrement.html b/tags/decrement.html new file mode 100644 index 000000000..05f7d0ab0 --- /dev/null +++ b/tags/decrement.html @@ -0,0 +1,186 @@ + + + + + Decrement | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Decrement

+ + + +
+
+

Added in: v1.9.1

+ +

Creates a new number variable, and decreases its value by one every time it is called. The first value is -1.

+

Input

+
{% decrement variable %}
{% decrement variable %}
{% decrement variable %}
+ +

Output

+
-1
-2
-3
+ +

Like increment, variables declared inside decrement are independent from variables created through assign or capture.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/for.html b/tags/for.html new file mode 100644 index 000000000..ff87337ba --- /dev/null +++ b/tags/for.html @@ -0,0 +1,257 @@ + + + + + For | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

For

+ + + +
+
+

Added in: v1.9.1

+ +

Iteration tags run blocks of code repeatedly.

+

Basic Usage

for…in

Repeatedly executes a block of code. For a full list of attributes available within a for loop, see forloop.

+

Input

+
{% for product in collection.products %}
{{ product.title }}
{% endfor %}
+ +

Output

+
hat shirt pants
+ +

For loops can iterate over arrays, hashes, and ranges of integers.

+

When iterating a hash, item[0] contains the key, and item[1] contains the value:

+

Input

+
{% for item in hash %}
* {{ item[0] }}: {{ item[1] }}
{% endfor %}
+ +

Output

+
* key1: value1
* key2: value2
+ +

else

Specifies a fallback case for a for loop which will run if the loop has zero length.

+

Input

+
{% for product in collection.products %}
{{ product.title }}
{% else %}
The collection is empty.
{% endfor %}
+ +

Output

+
The collection is empty.
+ +

break

Causes the loop to stop iterating when it encounters the break tag.

+

Input

+
{% for i in (1..5) %}
{% if i == 4 %}
{% break %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
+ +

Output

+
1 2 3
+ +

continue

Causes the loop to skip the current iteration when it encounters the continue tag.

+

Input

+
{% for i in (1..5) %}
{% if i == 4 %}
{% continue %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
+ +

Output

+
1 2 3   5
+ +

forloop

There’s a forloop object available inside for loops. It’s used to indicate the current state of for loop.

+

The forloop.first, forloop.last and forloop.length property:

+

Input

+
{% for i in (1..5) %}
{%- if forloop.first == true -%} First
{%- elsif forloop.last == true -%} Last
{%- else -%} {{ forloop.length }}
{%- endif %}
{% endfor -%}
+ +

Output

+
First
5
5
5
Last
+ +

The forloop.index, forloop.index0, forloop.rindex and forloop.rindex0 property:

+

Input

+
index index0 rindex rindex0
{% for i in (1..5) %}
{{- forloop.index }} {{ forloop.index0 }} {{ forloop.rindex }} {{ forloop.rindex0 }}
{% endfor -%}
+ +

Output

+
index index0 rindex rindex0
1 0 5 4
2 1 4 3
3 2 3 2
4 3 2 1
5 4 1 0
+ +

Parameters

limit

Limits the loop to the specified number of iterations.

+

Input

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array limit:2 %}
{{ item }}
{% endfor %}
+ +

Output

+
1 2
+ +

offset

Begins the loop at the specified index.

+

Input

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array offset:2 %}
{{ item }}
{% endfor %}
+ +

Output

+
3 4 5 6
+ +

range

Defines a range of numbers to loop through. The range can be defined by both literal and variable numbers.

+

Input

+
{% for i in (3..5) %}
{{ i }}
{% endfor %}

{% assign num = 4 %}
{% for i in (1..num) %}
{{ i }}
{% endfor %}
+ +

Output

+
3 4 5
1 2 3 4
+ +

reversed

Reverses the order of the loop. Note that this flag’s spelling is different from the filter reverse.

+

Input

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array reversed %}
{{ item }}
{% endfor %}
+ +

Output

+
6 5 4 3 2 1
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/if.html b/tags/if.html new file mode 100644 index 000000000..aa4e92d9b --- /dev/null +++ b/tags/if.html @@ -0,0 +1,191 @@ + + + + + If | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

If

+ + + +
+
+

Added in: v1.9.1

+ +

Executes a block of code only if a certain condition is true.

+

if

Input

+
{% if product.title == "Awesome Shoes" %}
These shoes are awesome!
{% endif %}
+ +

Output

+
These shoes are awesome!
+ +

elsif / else

Adds more conditions within an if or unless block.

+

Input

+
<!-- If customer.name = "anonymous" -->
{% if customer.name == "kevin" %}
Hey Kevin!
{% elsif customer.name == "anonymous" %}
Hey Anonymous!
{% else %}
Hi Stranger!
{% endif %}
+ +

Output

+
Hey Anonymous!
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/include.html b/tags/include.html new file mode 100644 index 000000000..2adf3737d --- /dev/null +++ b/tags/include.html @@ -0,0 +1,195 @@ + + + + + Include | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Include

+ + + +
+
+

Added in: v1.9.1

+ +
Deprecated

This tag is deprecated, use render tag instead for better encapsulation.

+
+ +

Include a Template

Renders a partial template from the template roots.

+
{% include 'footer.liquid' %}
+ +

When the extname option is set, the above .liquid extension can be omitted and writes:

+
{% include 'footer' %}
+ +

When a partial template is rendered by include, the code inside it can access its parent’s variables but its parent cannot access variables defined inside a included template.

+

Passing Variables

Variables defined in parent’s scope can be passed to a the partial template by listing them as parameters on the include tag:

+
{% assign my_variable = 'apples' %}
{% include 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

The with Parameter

A single object can be passed to a snippet by using the with...as syntax:

+
{% assign featured_product = all_products['product_handle'] %}
{% include 'product' with featured_product as product %}
+ +

In the example above, the product variable in the partial template will hold the value of featured_product in the parent template.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/increment.html b/tags/increment.html new file mode 100644 index 000000000..387b6858c --- /dev/null +++ b/tags/increment.html @@ -0,0 +1,193 @@ + + + + + Increment | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Increment

+ + + +
+
+

Added in: v1.9.1

+ +

Creates a new number variable, and increases its value by one every time it is called. The first value is 0.

+

Input

+
{% increment my_counter %}
{% increment my_counter %}
{% increment my_counter %}
+ +

Output

+
0
1
2
+ +

Variables created through the increment tag are independent from variables created through assign or capture.

+

In the example below, a variable named “var” is created through assign. The increment tag is then used several times on a variable with the same name. Note that the increment tag does not affect the value of “var” that was created through assign.

+

Input

+
{% assign var = 10 %}
{% increment var %}
{% increment var %}
{% increment var %}
{{ var }}
+ +

Output

+
0
1
2
10
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/layout.html b/tags/layout.html new file mode 100644 index 000000000..34b51a06a --- /dev/null +++ b/tags/layout.html @@ -0,0 +1,203 @@ + + + + + Layout | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Layout

+ + + +
+
+

Added in: v1.9.1

+ +

Using a Layout Template

Renders current template inside a layout template from the template roots.

+
{% layout 'footer.liquid' %}
+ +

Whe the extname option is set, the above .liquid extension can be omitted and writes:

+
{% layout 'footer' %}
+ +

When a partial template is rendered by layout, the code inside it can access its caller’s variables but its parent cannot access variables defined inside a included template.

+

Passing Variables

Variables defined in current template can be passed to a the layout template by listing them as parameters on the layout tag:

+
{% assign my_variable = 'apples' %}
{% layout 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

Blocks

The layout file can contain multiple blocks which will be populated by the child template (the caller). For example we have a default-layout.liquid file with the following contents:

+
Header
{% block content %}My default content{% endblock %}
Footer
+ +

And it’s called by a page.liquid file with layout tag:

+
{% layout "default-layout" %}
{% block content %}My page content{% endblock %}
+ +

The render result of page.liquid will be :

+
Header
My page content
Footer
+ +
Block
    +
  • Multiple blocks can be defined within a layout template;
  • +
  • The block name is optional when there's only one block.
  • +
  • The block contents will fallback to parent's corresponding block if not provided by child template.
  • +
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/overview.html b/tags/overview.html new file mode 100644 index 000000000..20bb85670 --- /dev/null +++ b/tags/overview.html @@ -0,0 +1,212 @@ + + + + + Tags | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Tags

+ + + +
+
+

LiquidJS implements business-logic independent tags that are typically implemented in shopify/liquid. This section contains the specification and demoes for all the tags implemented by LiquidJS.

+

There’re a dozen of tags supported by LiquidJS, with all tags in shopify/liquid. These tags can be categorized into these groups:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryPurposeTags
Iterationiterate over a collectionfor, cycle, tablerow
Control Flowcontrol the execution branch of template renderingif, unless, elsif, else, case, when
Variabledefine and alter variablesassign, increment, decrement
Fileinclude another template or extend a layout templaterender, include, layout
Languagetemporarily disable LiquidJS syntaxraw, comment
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/raw.html b/tags/raw.html new file mode 100644 index 000000000..755dc2633 --- /dev/null +++ b/tags/raw.html @@ -0,0 +1,184 @@ + + + + + Raw | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Raw

+ + + +
+
+

Added in: v1.9.1

+ +

Raw temporarily disables tag processing. This is useful for generating content
(eg, Mustache, Handlebars) which uses conflicting syntax.

+

Input

+
{% raw %}
In Handlebars, {{ this }} will be HTML-escaped, but
{{{ that }}} will not.
{% endraw %}
+ +

Output

+
In Handlebars, {{ this }} will be HTML-escaped, but {{{ that }}} will not.
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/render.html b/tags/render.html new file mode 100644 index 000000000..bca37a0aa --- /dev/null +++ b/tags/render.html @@ -0,0 +1,202 @@ + + + + + Render | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Render

+ + + +
+
+

Added in: v9.2.0

+ +

Basic Usage

Render a Template

Renders a partial template from the template roots.

+
{% render 'footer.liquid' %}
+ +

When the extname option is set, the above .liquid extension can be omitted and writes:

+
{% render 'footer' %}
+ +
Variable Scope

When a partial template is rendered, the code inside it can’t access its parent’s variables and its variables won’t be accessible by its parent. This encapsulation helps make theme code easier to understand and maintain.

+
+ +

Passing Variables

Variables defined in parent’s scope can be passed to a the partial template by listing them as parameters on the render tag:

+
{% assign my_variable = 'apples' %}
{% render 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

globals don’t need to be passed down. They are accessible from all files.

+

Parameters

The with Parameter

A single object can be passed to a snippet by using the with...as syntax:

+
{% assign featured_product = all_products['product_handle'] %}
{% render 'product' with featured_product as product %}
+ +

In the example above, the product variable in the partial template will hold the value of featured_product in the parent template.

+

The for Parameter

A partial template can be rendered once for each value of an enumerable by using the for...as syntax:

+
{% assign variants = product.variants %}
{% render 'variant' for variants as variant %}
+ +

In the example above, the partial template will be rendered once for each variant of the product, and the variant variable will hold a product’s variant object within the snippet.

+
The forloop object

When using the for parameter, the forloop object is accessible within the snippet.

+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/tablerow.html b/tags/tablerow.html new file mode 100644 index 000000000..343352469 --- /dev/null +++ b/tags/tablerow.html @@ -0,0 +1,200 @@ + + + + + Table Row | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Table Row

+ + + +
+
+

Added in: v1.9.1

+ +

Generates an HTML table. Must be wrapped in opening <table> and closing </table> HTML tags.

+

Basic Usage

Input

+
<table>
{% tablerow product in collection.products %}
{{ product.title }}
{% endtablerow %}
</table>
+ +

Output

+
<table>
<tr class="row1">
<td class="col1">
Cool Shirt
</td>
<td class="col2">
Alien Poster
</td>
<td class="col3">
Batman Poster
</td>
<td class="col4">
Bullseye Shirt
</td>
<td class="col5">
Another Classic Vinyl
</td>
<td class="col6">
Awesome Jeans
</td>
</tr>
</table>
+ +

Parameters

cols

Defines how many columns the tables should have.

+

Input

+
{% tablerow product in collection.products cols:2 %}
{{ product.title }}
{% endtablerow %}
+ +

Output

+
<table>
<tr class="row1">
<td class="col1">
Cool Shirt
</td>
<td class="col2">
Alien Poster
</td>
</tr>
<tr class="row2">
<td class="col1">
Batman Poster
</td>
<td class="col2">
Bullseye Shirt
</td>
</tr>
<tr class="row3">
<td class="col1">
Another Classic Vinyl
</td>
<td class="col2">
Awesome Jeans
</td>
</tr>
</table>
+ +

limit

Exits the tablerow after a specific index.

+
{% tablerow product in collection.products cols:2 limit:3 %}
{{ product.title }}
{% endtablerow %}
+ +

offset

Starts the tablerow after a specific index.

+
{% tablerow product in collection.products cols:2 offset:3 %}
{{ product.title }}
{% endtablerow %}
+ +

range

Defines a range of numbers to loop through. The range can be defined by both literal and variable numbers.

+
<!--variable number example-->

{% assign num = 4 %}
<table>
{% tablerow i in (1..num) %}
{{ i }}
{% endtablerow %}
</table>

<!--literal number example-->

<table>
{% tablerow i in (3..5) %}
{{ i }}
{% endtablerow %}
</table>
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tags/unless.html b/tags/unless.html new file mode 100644 index 000000000..a04eb8fc6 --- /dev/null +++ b/tags/unless.html @@ -0,0 +1,187 @@ + + + + + Unless | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Unless

+ + + +
+
+

Added in: v1.9.1

+ +

The opposite of if – executes a block of code only if a certain condition is not met.

+

Input

+
{% unless product.title == "Awesome Shoes" %}
These shoes are not awesome.
{% endunless %}
+ +

Output

+
These shoes are not awesome.
+ +

This would be the equivalent of doing the following:

+
{% if product.title != "Awesome Shoes" %}
These shoes are not awesome.
{% endif %}
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/caching.html b/tutorials/caching.html new file mode 100644 index 000000000..1532fb577 --- /dev/null +++ b/tutorials/caching.html @@ -0,0 +1,189 @@ + + + + + Caching | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Caching

+ + + +
+
+

In a typical website project, we’ll have a directory of view templates and they’ll be rendered multiple times. In production environment the template files are not likely to be changed over time (other than re-deployments). Thus it makes sense to cache the file contents and the parsed templates (in a kind of AST) to improve performance.

+

LiquidJS provides multiple ways to cache the parsed templates to improve performance.

+

Programmaticly

The .parse(), .parseFile(), .parseFileSync() APIs are used to parse templates from string or files. The result template can be then rendered multiple times with different context.

+

Parse from string:

+
var tpl = engine.parse('{{name | capitalize}}');

engine.renderSync(tpl, {name: 'alice'}) // 'Alice'
engine.renderSync(tpl, {name: 'bob'}) // 'Bob'
+ +

Parse from file:

+
var tpl = engine.parseFileSync('hello');    // contents of `hello.liquid`: {{name}}

engine.renderSync(tpl, {name: 'alice'}) // 'Alice'
engine.renderSync(tpl, {name: 'bob'}) // 'Bob'
+ +

The template string/file is parsed only once and renderd multiple times using different context. Templates for different files can be stored into a Map and can be retrieved directly for subsequent renders.

+

The cache Option

The cache option can be set to instruct liquidjs to use cached parsed templates each time you call renderFile or renderFileSync.

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
cache: true
});

// liquidjs parses the hello.liquid, then renders it with {name: 'alice'}
engine.renderFileSync('hello', {name: 'alice'})

// liquidjs finds the cached template, then renders it with {name: 'bob'}
engine.renderFileSync('hello', {name: 'bob'})
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/contribution-guidelines.html b/tutorials/contribution-guidelines.html new file mode 100644 index 000000000..a96810178 --- /dev/null +++ b/tutorials/contribution-guidelines.html @@ -0,0 +1,187 @@ + + + + + Contribution Guideline | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Contribution Guideline

+ + + +
+
+

Show Me Your Code

Code Style: LiquidJS applies standard and @typescript-eslint/recommended rules, make sure it’s still valid before commit:

+
npm run lint
+ +

Testing: Make sure test cases pass with your patch merged:

+
npm test
+ +

Commit Message: Please align to the Angular Commit Message Guidelines, especially note the type identifier, on which semantic-release bot depends.

+

Star on Github 👉 harttle/liquidjs

This is the easiest way to support us: boost its rank and expose it to more people, which in turn makes it better.

+

Financial Support

LiquidJS is Open Source and Free and without capitalists support and without any ADs. To help it live and thrive, consider contribute on Open Collective or Patreon. To acknowledge your contribution, your name and avatar will be listed here and on Github README.

+

+

Become a Patron!

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/differences.html b/tutorials/differences.html new file mode 100644 index 000000000..630d76331 --- /dev/null +++ b/tutorials/differences.html @@ -0,0 +1,186 @@ + + + + + Differences with Shopify/liquid | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Differences with Shopify/liquid

+ + + +
+
+

All filters and tags in shopify/liquid are supposed to be built in LiquidJS, but not those business-logic specific tags/filters which are typically from Shopify themes (see Plugins List in case you’re looking for them and feel free to add yours to the list). Though being compatible the Ruby version is one of our priorities, there are still some differences:

+
    +
  • Truthy and Falsy. All values except undefined, null, false are truthy, whereas in Ruby Liquid all except nil and false are truthy. See #26.
  • +
  • Number. In JavaScript we cannot distinguish or convert between float and integer, see #59. And when applied size filter, numbers always return 0, which is 8 for integer in ruby, cause they do not have a length property.
  • +
  • .to_liquid() is replaced by .toLiquid()
  • +
  • .to_s() is replaced by JavaScript .toString()
  • +
  • Iteration order for objects. The iteration order of JavaScript objects, and thus LiquidJS objects, is a combination of the insertion order for string keys, and ascending order for number-like keys, while the iteration order of Ruby Hash is simply the insertion order.
  • +
  • Sort stability. The sort stability is also not defined in both shopify/liquid and LiquidJS, but it’s considered stable for LiquidJS in Node.js 12+ and Google Chrome 70+.
  • +
  • Trailing unmatched characters inside filters are allowed in shopify/liquid but not in LiquidJS. It means filter arguments without a colon like {{ "a b" | split " "}} will throw an error in LiquidJS. This is intended to improve Liquid usability, see #208 and #212.
  • +
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/intro-to-liquid.html b/tutorials/intro-to-liquid.html new file mode 100644 index 000000000..1115ee9c2 --- /dev/null +++ b/tutorials/intro-to-liquid.html @@ -0,0 +1,199 @@ + + + + + Introduction to Liquid Template Language | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Introduction to Liquid Template Language

+ + + +
+
+

LiquidJS is a simple, expressive, safe and shopify compatible template engine in pure JavaScript. The purpose of this repo is to provide a standard Liquid implementation for the JavaScript community. Liquid is originally implemented in Ruby and used by Github Pages, Jekyll and Shopify, see Differences with Shopify/liquid.

+

LiquidJS syntax is relatively simple. There’re 2 types of markups in LiquidJS:

+
    +
  • Tags. A tag consists of a tag name and optional arguments wrapped between {% and %}.
  • +
  • Outputs. An output consists of a value and a list of filters, which is optional, wrapped between {{ and }}.
  • +
+

Outputs

Outputs are used to output variables, which can be transformed by filters, into HTML. The following template will insert the value of username into the input’s value:

+
<input type="text" name="user" value="{{username}}">
+ +

Values in output can be transformed by filters before output. To append a string after the variable:

+
{{ username | append: ", welcome to LiquidJS!" }}
+ +

Filters can be chained:

+
{{ username | append: ", welcome to LiquidJS!" | capitalize }}
+ +

A complete list of filters supported by LiquidJS can be found here.

+

Tags

Tags are used to control the template rendering process, manipulating template variables, inter-op with other templates, etc. For example assign can be used to define a variable which can be later used in the template:

+
{% assign foo = "FOO" %}
+ +

Typically tags appear in pairs with a start tag and a corresponding end tag. For example:

+
{% if foo == "FOO" %}
Variable `foo` equals "FOO"
{% else %}
Variable `foo` not equals "FOO"
{% endif %}
+ +

A complete list of tags supported by LiquidJS can be found here.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/migrate-to-9.html b/tutorials/migrate-to-9.html new file mode 100644 index 000000000..9d1b247ad --- /dev/null +++ b/tutorials/migrate-to-9.html @@ -0,0 +1,197 @@ + + + + + Migrate to LiquidJS 9 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Migrate to LiquidJS 9

+ + + +
+
+

LiquidJS 9 has some fundamental improvements, including bugfixes, new features and performance improvement due to higher target(see #137). There’re also some breaking changes.

+

Features

    +
  • Sync rendering: renderSync, parseAndRenderSync, renderFileSync
  • +
  • New utils: Expression
  • +
+

Fixes

    +
  • Rewrite boolean expression evaluation order, #130;
  • +
  • break and continue tags omitting output before them, #123;
  • +
  • Fixes errors in React.js demo during yarn install, #145;
  • +
  • Promise typed Drops are not await-ed some times.
  • +
+

Performance

    +
  • Performance Improvements due to targeting to Node.js 8, see #137;
  • +
  • Memory footprint is reduced by 57.5%, see #202;
  • +
  • Render performance is improved by 100.3%, see #205.
  • +
+

BREAKING CHANGES

    +
  • LiquidJS no longer has a default export, use import {Liquid} from 'liquidjs' instead. The window.Liquid for the UMD bundle is also changed to window.liquidjs.Liquid;
  • +
  • The duplicate static method Liquid.evalValue is removed, use the instance method liquid.evalValue instead;
  • +
  • Shipped to Node.js 8, the CJS bundle (main entry in Node.js) nolonger supports Node.js ≤ 6. ESM (dist/liquid.node.esm.js) and UMD (dist/liquid.browser.umd.js, dist/liquid.browser.min.js) bundles are not affected.
  • +
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/operators.html b/tutorials/operators.html new file mode 100644 index 000000000..9f83134bf --- /dev/null +++ b/tutorials/operators.html @@ -0,0 +1,187 @@ + + + + + Operators | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Operators

+ + + +
+
+

LiquidJS operators are very simple and different. There’re 2 types of operators supported:

+
    +
  • Comparison operators: ==, !=, >, <, >=, <=
  • +
  • Logic operators: or, and, contains
  • +
+

Thus numerical operators are not supported and you cannot even plus two numbers like this {{a + b}}, instead we need a filter {{ a | plus: b}}. Actually + is a valid variable name in LiquidJS.

+

Precedence

    +
  1. Comparison operators. All comparison operations have the same precedence and higher than logic operators.
  2. +
  3. Logic operators. All logic operators have the same precedence.
  4. +
+

Associativity

Logic operators are evaluated from right to left, see shopify docs.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/options.html b/tutorials/options.html new file mode 100644 index 000000000..ee492dbd8 --- /dev/null +++ b/tutorials/options.html @@ -0,0 +1,215 @@ + + + + + Options | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Options

+ + + +
+
+

The Liquid constructor accepts a plain object as options to define the behaviour of LiquidJS. All of these options are optional thus we can specify any of them, for example the cache option:

+
const { Liquid } = require('liquidjs')
const engine = new Liquid({
cache: true
})
+ +
API Document

Following is an overview for all the options, for exact types and signatures please refer to LiquidOptions | API.

+
+ +

cache

cache is used to improve performance by caching previously parsed template structures, specially in cases when we’re repeatedly parse or render files.

+

It’s default to false. When setting to true a default LRU cache of size 1024 will be enabled. And certainly it can be a number which indicates the size of cache you want.

+

Additionally, it can also be a custom cache implementation. See Caching for details.

+

dynamicPartials

dynamicPartials indicates whether or not to treat filename arguments in include, render, layout tags as a variable. Defaults to true. For example, render the following snippet with scope { file: 'foo.html' } will include the foo.html:

+
{% include file %}
+ +

Setting dynamicPartials: false, LiquidJS will try to include the file named file, which is weird but allows simpler syntax if your template relations are static:

+
{% liquid foo.html %}
+ +
Common Pitfall

LiquidJS defaults this option to true to be compatible with shopify/liquid, but if you’re from eleventy it’s set to false by default (see Quoted Include Paths) which I believe is trying to be compatible with Jekyll.

+
+ +

extname

extname defines the default extname to be appended into filenames if the filename has no extname. Defaults to '' which means it’s disabled by default. By setting it to .liquid:

+
{% render "foo" %}  there's no extname, adds `.liquid` and loads foo.liquid
{% render "foo.html" %} there is an extname already, loads foo.html directly
+ +
Legacy Versions

Before 2.0.1, extname is set to .liquid by default. To change that you need to set extname: '' explicitly. See #41 for details.

+
+ +

root

root is used to specify template directories for LiquidJS to lookup and read template files. Can be a single string and an array of strings. See Render Files for details.

+

fs

fs is used to define a custom file system implementation which will be used by LiquidJS to lookup and read template files. See Abstract File System for details.

+

globals

globals is used to define global variables available to all templates even in cases of render tag. See 3185 for details.

+

jsTruthy

jsTruthy is used to use standard Javascript truthiness rather than the Shopify.

+

it defaults to false. For example, when set to true, a blank string would evaluate to false with jsTruthy. With Shopify’s truthiness, a blank string is true.

+

Trimming

greedy, trimOutputLeft, trimOutputRight, trimTagLeft, trimTagRight options are used to eliminate extra newlines and indents in templates arround Liquid Constructs. See Whitespace Control for details.

+

Delimiter

outputDelimiterLeft, outputDelimiterRight, tagDelimiterLeft, tagDelimiterRight are used to customize the delimiters for LiquidJS Tags and Filters. For example with outputDelimiterLeft: <%=, outputDelimiterRight: %> we are able to avoid conflicts with other languages:

+
<%= username | append: ", welcome to LiquidJS!" %>
+ +

Strict

strictFilters is used to assert filter existence. If set to false, undefined filters will be skipped. Otherwise, undefined filters will cause a parse exception. Defaults to false.

+

strictVariables is used to assert variable existence. If set to false, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause a render exception. Defaults to false.

+

lenientIf modifies the behavior of strictVariables to allow handling optional variables. If set to true, an undefined variable will not cause an exception in the following two situations: a) it is the condition to an if, elsif, or unless tag; b) it occurs right before a default filter. Irrelevant if strictVariables is not set. Defaults to false.

+
Non-existent Tags

Non-existent tags always throw errors during pasrsing and this behaviour can not be customized.

+
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/partials-and-layouts.html b/tutorials/partials-and-layouts.html new file mode 100644 index 000000000..6faa8cba1 --- /dev/null +++ b/tutorials/partials-and-layouts.html @@ -0,0 +1,193 @@ + + + + + Partials and Layouts | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Partials and Layouts

+ + + +
+
+

Render Partials

For the following template files:

+
// file: color.liquid
color: '{{ color }}' shape: '{{ shape }}'

// file: theme.liquid
{% assign shape = 'circle' %}
{% render 'color.liquid' %}
{% render 'color.liquid' with 'red' %}
{% render 'color.liquid', color: 'yellow', shape: 'square' %}
+ +

The output will be:

+
color: '' shape: 'circle'
color: 'red' shape: 'circle'
color: 'yellow' shape: 'square'
+ +

More details please refer to the render tag.

+
The ".liquid" Extension

The “.liquid” extension in layout, render and include an be omitted if Liquid instance is created using extname: ".liquid" option. See the extname option for details.

+
+ +

Layout Templates (Extends)

For the following template files:

+
// file: default-layout.liquid
Header
{% block content %}My default content{% endblock %}
Footer

// file: page.liquid
{% layout "default-layout.liquid" %}
{% block content %}My page content{% endblock %}
+ +

The output of page.liquid:

+
Header
My page content
Footer
+ +

More details please refer to the layout tag.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/plugins.html b/tutorials/plugins.html new file mode 100644 index 000000000..d74c19efe --- /dev/null +++ b/tutorials/plugins.html @@ -0,0 +1,190 @@ + + + + + Plugins | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Plugins

+ + + +
+
+

A number of tags and filters can be encapsulated into a plugin, which will be typically installed via npm. This article provides information about how to create and use a plugin.

+

Write a Plugin

A liquidjs plugin is simple function which takes the Liquid class as the first parameter and the Liquid instance for this. We can call liquidjs APIs on this to make certain changes, especially register filters and tags.

+

Now we’ll make a plugin to upper case every letter of the input, save the following snippet to upup.js:

+
/**
* Inside the plugin function, `this` refers to the Liquid instance.
*
* @param Liquid: provides facilities to implement tags and filters.
*/
module.exports = function (Liquid) {
this.registerFilter('upup', x => x.toUpperCase());
}
+ +

Use a Plugin

Simply pass the plugin function into the .plugin() method:

+
const engine = new Liquid()

engine.plugin(require('./upup.js'));
engine
.parseAndRender('{{ "foo" | upup }}')
.then(console.log) // outputs "FOO"
+ +

Plugin List

Since this library excludes certain features that are available on the Shopify platform but not on the Shopify/liquid repo, see https://github.com/harttle/liquidjs#differences-and-limitations.

+

Here’s a list of plugins that backfill those features. Feel free to add yours, this file is publicly editable.

+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/register-filters-tags.html b/tutorials/register-filters-tags.html new file mode 100644 index 000000000..71d1600b5 --- /dev/null +++ b/tutorials/register-filters-tags.html @@ -0,0 +1,191 @@ + + + + + Register Filters/Tags | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Register Filters/Tags

+ + + +
+
+

Register Tags

// Usage: {% upper name %}
import { TagToken, Context, Emitter, TopLevelToken } from 'liquidjs'

engine.registerTag('upper', {
parse: function(tagToken: TagToken, remainTokens: TopLevelToken[]) {
this.str = tagToken.args; // name
},
render: async function(ctx: Context) {
var str = await this.liquid.evalValue(this.str, ctx); // 'alice'
return str.toUpperCase() // 'ALICE'
}
});
+ +
    +
  • parse: Read tokens from remainTokens until your end token.
  • +
  • render: Combine scope data with your parsed tokens into HTML string.
  • +
+

See existing tag implementations here: https://github.com/harttle/liquidjs/tree/master/src/builtin/tags
See demo example here: https://github.com/harttle/liquidjs/blob/master/demo/typescript/index.ts

+

Register Filters

// Usage: {{ name | upper }}
engine.registerFilter('upper', v => v.toUpperCase())
+ +

Filter arguments will be passed to the registered filter function, for example:

+
// Usage: {{ 1 | add: 2, 3 }}
engine.registerFilter('add', (initial, arg1, arg2) => initial + arg1 + arg2)
+ +

See existing filter implementations here: https://github.com/harttle/liquidjs/tree/master/src/builtin/filters

+

Unregister Tags/Filters

In some cases it’s desirable to disable some tags/filters (see #324), you’ll need to register a dummy tag/filter in which an corresponding Error throws.

+
// disable a tag
const disabledTag = {
parse: function(token) {
throw new Error(`tag "${token.name}" disabled`);
}
}
engine.registerTag('include', disabledTag);

// disable a filter
function disabledFilter(name) {
return function () {
throw new Error(`filter "${name}" disabled`);
}
}
engine.registerFilter('plus', disabledFilter('plus'));
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/render-file.html b/tutorials/render-file.html new file mode 100644 index 000000000..8eee1e759 --- /dev/null +++ b/tutorials/render-file.html @@ -0,0 +1,208 @@ + + + + + Render Files | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Render Files

+ + + +
+
+

For a typical project there could be a directory of template files, you’ll need to set the template root and call renderFile or renderFileSync to render a specific file.

+

Render a File

For example you have a directory of templates like this:

+
.
├── index.js
└── views/
├── hello.liquid
└── world.liquid
+ +

hello.liquid contains a single line `name: {{name}}`.
Now save the following contents into index.js:

+
var engine = new Liquid({
root: path.resolve(__dirname, 'views/'), // root for layouts/includes lookup
extname: '.liquid' // used for layouts/includes, defaults ""
});
engine
.renderFile("hello", {name: 'alice'}) // will read and render `views/hello.liquid`
.then(console.log) // outputs "Alice"
+ +

Run node index.js and you’ll get output like this:

+
> node index.js
name: alice
+ +

Template Lookup

Template files names passed to renderFile, parseFile, renderFileSync, parseFileSync APIs,
and include, layout tags are resolved against the root option.

+

It can be a string-typed path (see above example), or a list of root directories, in which case templates will be looked up in that order. e.g.

+
var engine = new Liquid({
root: ['views/', 'views/partials/'],
extname: '.liquid'
});
+ +
Relative Paths

Relative paths in root will be resolved against cwd().

+
+ +

When {% render "foo" %} is renderd or liquid.renderFile('foo') is called, the following files will be looked up and the first existing file will be used:

+
    +
  • cwd()/views/foo.liquid
  • +
  • cwd()/views/partials/foo.liquid
  • +
+

If none of the above files exists, an ENOENT error will be throwed. Here’s a demo for Node.js: demo/nodejs.

+

When LiquidJS is used in browser, say current location is https://example.com/bar/index.html, only the first root will be used and the file to be fetched is:

+ +

If fetch fails, a 404/500 error or network failures for example, an ENOENT error will be throwed.
Here’s a demo for browsers: demo/browser.

+

Abstract File System

LiquidJS defines an abstract file system interface in src/fs/ifs.ts and the default implementation is src/fs/node.ts for Node.js and src/fs/browser.ts for the browser bundle.

+

The Liquid constructor provides a fs option to specify the file system implementation. It’s supposed to be used to define customized template fetching logic, i.e. fetch template from a database table, like:

+
var engine = new Liquid({
fs: {
readFileSync (file) {
return db.model('Template').findByIdSync(file).text
},
await readFile (file) {
const template = await db.model('Template').findById(file)
return template.text
},
existsSync () {
return true
},
await exists () {
return true
},
resolve(root, file, ext) {
return file
}
}
});
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/setup.html b/tutorials/setup.html new file mode 100644 index 000000000..90c8f817a --- /dev/null +++ b/tutorials/setup.html @@ -0,0 +1,208 @@ + + + + + Setup | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Setup

+ + + +
+
+

In case you’re not familiar with Liquid Template Language, see Introduction to Liquid Template Language.

+

LiquidJS in Node.js

Install via npm:

+
npm install --save liquidjs
+ +
var { Liquid } = require('liquidjs');
var engine = new Liquid();

engine
.parseAndRender('{{name | capitalize}}', {name: 'alice'})
.then(console.log); // outputs 'Alice'
+ +
Working Demo

Here’s a working demo for LiquidJS usage in Node.js: liquidjs/demo/nodejs/.

+
+ +Type definitions for LiquidJS are also exported and published, which makes it more enjoyable for TypeScript projects: + +
import { Liquid } from 'liquidjs';
const engine = new Liquid();

engine
.parseAndRender('{{name | capitalize}}', {name: 'alice'})
.then(console.log); // outputs 'Alice'
+ +
Working Demo

Here’s a working demo for LiquidJS usage in TypeScript: liquidjs/demo/typescript/.

+
+ +

LiquidJS in Browsers

Pre-built UMD bundles are also available:

+
<!--for production-->
<script src="https://cdn.jsdelivr.net/npm/liquidjs/dist/liquid.browser.min.js"></script>
<!--for development-->
<script src="https://cdn.jsdelivr.net/npm/liquidjs/dist/liquid.browser.umd.js"></script>
+ +
Working Demo

Here’s a living demo on jsFiddle: jsfiddle.net/pd4jhzLs/1/, and the source code is also available in liquidjs/demo/browser/.

+
+ +
Compatibility

You may need a Promise polyfill for legacy browsers like IE and Android UC, see caniuse statistics.

+
+ +

LiquidJS in CLI

LiquidJS is also available from CLI:

+
echo '{{"hello" | capitalize}}' | npx liquidjs
+ +

If you pass a path to a JSON file or a JSON string as the first argument, it will be used as the context for your template.

+
echo 'Hello, {{ name }}.' | npx liquidjs '{"name": "Snake"}'
+ +

Miscellaneous

A ReactJS demo is also added by @stevenanthonyrevo, see liquidjs/demo/reactjs/.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/truthy-and-falsy.html b/tutorials/truthy-and-falsy.html new file mode 100644 index 000000000..1d293c878 --- /dev/null +++ b/tutorials/truthy-and-falsy.html @@ -0,0 +1,307 @@ + + + + + Truthy and Falsy | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Truthy and Falsy

+ + + +
+
+

Though Liquid is platform-independent, there’re certain differences with the Ruby version, one of which is the truthy value.

+

The Truth Table

According to Shopify document everything other than false and nil is truthy. But in JavaScript we have a totally different type system, we have types like undefined and we don’t differentiate integer and float, thus things are slightly different:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
valuetruthyfalsy
true✔️
false✔️
null✔️
undefined✔️
string✔️
empty string✔️
0✔️
integer✔️
float✔️
array✔️
empty array✔️
+

Use JavaScript Truthy

Note that liquidjs use Shopify’s truthiness by default. But it can be toggled to used standard JavaScript truthiness by setting the jsTruthy option to true.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
valuetruthyfalsy
true✔️
false✔️
null✔️
undefined✔️
string✔️
empty string✔️
0✔️
integer✔️
float✔️
array✔️
empty array✔️
+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/use-in-expressjs.html b/tutorials/use-in-expressjs.html new file mode 100644 index 000000000..b6dfc61d4 --- /dev/null +++ b/tutorials/use-in-expressjs.html @@ -0,0 +1,194 @@ + + + + + Use in Express.js | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Use in Express.js

+ + + +
+
+

LiquidJS is compatible to the express template engines. You can set liquidjs instance to the view engine option:

+
var { Liquid } = require('liquidjs');
var engine = new Liquid();

// register liquid engine
app.engine('liquid', engine.express());
app.set('views', './views'); // specify the views directory
app.set('view engine', 'liquid'); // set liquid to default
+ +
Working Demo

Here’s a working demo for LiquidJS usage in Express.js: liquidjs/demo/express/.

+
+ +

Template Lookup

The root option will continue to work as templates root, as you can see in Render A Template File. Additionally, the views option in express.js (as shown above) will also be respected. Say you have a template directory like:

+
.
├── views1/
│ └── hello.liquid
└── views2/
└── world.liquid
+ +

And you’re setting template root for liquidjs to views1 and expressjs to views2:

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
root: './views1/'
});

app.engine('liquid', engine.express());
app.set('views', './views2'); // specify the views directory
app.set('view engine', 'liquid'); // set liquid to default
+ +

Both of hello.liquid and world.liquid can be resolved and rendered:

+
res.render('hello')
res.render('world')
+ +

Caching

Simply setting the cache option to true will enable template caching, as explained in Caching. It’s recommended to enable cache in production environment, which can be done by:

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
cache: process.env.NODE_ENV === 'production'
});
+ + +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/tutorials/whitespace-control.html b/tutorials/whitespace-control.html new file mode 100644 index 000000000..8e5c532ca --- /dev/null +++ b/tutorials/whitespace-control.html @@ -0,0 +1,199 @@ + + + + + Whitespace Control | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Whitespace Control

+ + + +
+
+

To keep source code neat and indented, we’re adding spaces to our templates. LiquidJS offers whitespace control capabilities to eliminate these unwanted whitespaces in output HTML.

+

via Markups

By default, all tags and output markups lines will generate a NL (\n), and whitespaces if there’s any indentation. For example:

+
{%  author = "harttle" %}
{{ author }}
+ +

Outputs (note the blank link):

+

harttle
+ +

We can include hyphens in your tag syntax ({{-, -}}, {%-, -%}) to strip whitespace from left or right. For example:

+
{% assign author = "harttle" -%}
{{ author }}
+ +

Outputs:

+
harttle
+ +

In this case, the -%} strips the whitespace from the right side of the assign tag.

+

via Options

Alternatively, LiquidJS provides these per engine options to enable whitespace control without sweeping changes of your templates:

+
    +
  • trimTagLeft
  • +
  • trimTagRight
  • +
  • trimValueRight
  • +
  • trimValueRight
  • +
+

LiquidJS will NOT trim any whitespace by default, aka. above options all default to false. For details of these options, see the options.

+

Greedy Mode

In greedy mode (enabled by the greedy option), all consecutive whitespace chars (including \n) will be trimmed. Greedy mode is enabled by default to be compliant with shopify/liquid.

+ +
+
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/cache_lru_.lru.html b/zh-cn/api/classes/cache_lru_.lru.html new file mode 100644 index 000000000..f834a8d2d --- /dev/null +++ b/zh-cn/api/classes/cache_lru_.lru.html @@ -0,0 +1,287 @@ + + + + + Class: LRU <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LRU <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • LRU
  • +
+

Implements

+

Constructors

constructor

+ new LRU(limit: number, size: number): LRU

+

Defined in cache/lru.ts:15

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
limitnumber-
sizenumber0
+

Returns: LRU

+

Properties

Private cache

cache: object

+

Defined in cache/lru.ts:13

+

Type declaration:

    +
  • [ key: string]: Node‹T›
  • +
+
+

Private head

head: Node‹T›

+

Defined in cache/lru.ts:14

+
+

limit

limit: number

+

Defined in cache/lru.ts:18

+
+

size

size: number

+

Defined in cache/lru.ts:19

+
+

Private tail

tail: Node‹T›

+

Defined in cache/lru.ts:15

+

Methods

clear

clear(): void

+

Defined in cache/lru.ts:57

+

Returns: void

+
+

Private ensureLimit

ensureLimit(): void

+

Defined in cache/lru.ts:64

+

Returns: void

+
+

read

read(key: string): T | undefined

+

Implementation of Cache

+

Defined in cache/lru.ts:41

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: T | undefined

+
+

remove

remove(key: string): void

+

Defined in cache/lru.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: void

+
+

write

write(key: string, value: T): void

+

Implementation of Cache

+

Defined in cache/lru.ts:27

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueT
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/cache_lru_.node.html b/zh-cn/api/classes/cache_lru_.node.html new file mode 100644 index 000000000..54966abac --- /dev/null +++ b/zh-cn/api/classes/cache_lru_.node.html @@ -0,0 +1,219 @@ + + + + + Class: Node <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Node <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • Node
  • +
+

Constructors

constructor

+ new Node(key: string, value: T, next: Node‹T›, prev: Node‹T›): Node

+

Defined in cache/lru.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
keystring
valueT
nextNode‹T›
prevNode‹T›
+

Returns: Node

+

Properties

key

key: string

+

Defined in cache/lru.ts:5

+
+

next

next: Node‹T›

+

Defined in cache/lru.ts:7

+
+

prev

prev: Node‹T›

+

Defined in cache/lru.ts:8

+
+

value

value: T

+

Defined in cache/lru.ts:6

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/context_context_.context.html b/zh-cn/api/classes/context_context_.context.html new file mode 100644 index 000000000..2ae45c7c2 --- /dev/null +++ b/zh-cn/api/classes/context_context_.context.html @@ -0,0 +1,386 @@ + + + + + Class: Context | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Context

+ + + +
+
+

Hierarchy

    +
  • Context
  • +
+

Constructors

constructor

+ new Context(env: object, opts: NormalizedFullOptions, sync: boolean): Context

+

Defined in context/context.ts:14

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
envobject{}
optsNormalizedFullOptionsdefaultOptions
syncbooleanfalse
+

Returns: Context

+

Properties

environments

environments: Scope

+

Defined in context/context.ts:11

+
+

globals

globals: Scope

+

Defined in context/context.ts:12

+
+

opts

opts: NormalizedFullOptions

+

Defined in context/context.ts:14

+
+

Private registers

registers: object

+

Defined in context/context.ts:10

+

Type declaration:


+

Private scopes

scopes: Scope[] = [{}]

+

Defined in context/context.ts:9

+
+

sync

sync: boolean

+

Defined in context/context.ts:13

+

Methods

bottom

bottom(): PlainObject | Drop

+

Defined in context/context.ts:57

+

Returns: PlainObject | Drop

+
+

Private findScope

findScope(key: string): PlainObject | Drop

+

Defined in context/context.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: PlainObject | Drop

+
+

get

get(paths: string[]): object

+

Defined in context/context.ts:37

+

Parameters:

+ + + + + + + + + + + +
NameType
pathsstring[]
+

Returns: object

+
+

getAll

getAll(): PlainObject | Drop

+

Defined in context/context.ts:33

+

Returns: PlainObject | Drop

+
+

getFromScope

getFromScope(scope: object, paths: string[] | string): object

+

Defined in context/context.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
scopeobject
pathsstring[] | string
+

Returns: object

+
+

getRegister

getRegister(key: string, defaultValue: object): any

+

Defined in context/context.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
keystring-
defaultValueobject{}
+

Returns: any

+
+

pop

pop(): undefined | PlainObject | Drop

+

Defined in context/context.ts:54

+

Returns: undefined | PlainObject | Drop

+
+

push

push(ctx: object): number

+

Defined in context/context.ts:51

+

Parameters:

+ + + + + + + + + + + +
NameType
ctxobject
+

Returns: number

+
+

restoreRegister

restoreRegister(keyValues: [string, any][]): void

+

Defined in context/context.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
keyValues[string, any][]
+

Returns: void

+
+

saveRegister

saveRegister(…keys: string[]): [string, any][]

+

Defined in context/context.ts:27

+

Parameters:

+ + + + + + + + + + + +
NameType
...keysstring[]
+

Returns: [string, any][]

+
+

setRegister

setRegister(key: string, value: any): any

+

Defined in context/context.ts:24

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueany
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_blank_drop_.blankdrop.html b/zh-cn/api/classes/drop_blank_drop_.blankdrop.html new file mode 100644 index 000000000..55b293208 --- /dev/null +++ b/zh-cn/api/classes/drop_blank_drop_.blankdrop.html @@ -0,0 +1,242 @@ + + + + + Class: BlankDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: BlankDrop

+ + + +
+
+

Hierarchy

EmptyDrop

+

BlankDrop

+

Implements

+

Methods

equals

equals(value: any): boolean

+

Overrides EmptyDrop.equals

+

Defined in drop/blank-drop.ts:5

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Inherited from EmptyDrop.geq

+

Defined in drop/empty-drop.ts:16

+

Returns: boolean

+
+

gt

gt(): boolean

+

Inherited from EmptyDrop.gt

+

Defined in drop/empty-drop.ts:13

+

Returns: boolean

+
+

leq

leq(): boolean

+

Inherited from EmptyDrop.leq

+

Defined in drop/empty-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Inherited from EmptyDrop.lt

+

Defined in drop/empty-drop.ts:19

+

Returns: boolean

+
+

valueOf

valueOf(): string

+

Inherited from EmptyDrop.valueOf

+

Overrides Drop.valueOf

+

Defined in drop/empty-drop.ts:25

+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_block_drop_.blockdrop.html b/zh-cn/api/classes/drop_block_drop_.blockdrop.html new file mode 100644 index 000000000..8a563e615 --- /dev/null +++ b/zh-cn/api/classes/drop_block_drop_.blockdrop.html @@ -0,0 +1,216 @@ + + + + + Class: BlockDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: BlockDrop

+ + + +
+
+

Hierarchy

    +
  • Drop

    +

    BlockDrop

    +
  • +
+

Constructors

constructor

+ new BlockDrop(superBlockRender: function): BlockDrop

+

Defined in drop/block-drop.ts:3

+

Parameters:

+

Default value superBlockRender: function= () => ‘’

+

▸ (): Iterable‹string›

+

Returns: BlockDrop

+

Properties

Private superBlockRender

superBlockRender: function

+

Defined in drop/block-drop.ts:6

+

Type declaration:

▸ (): Iterable‹string›

+

Methods

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

super

super(): Iterable‹string›

+

Defined in drop/block-drop.ts:10

+

Returns: Iterable‹string›

+
+

valueOf

valueOf(): any

+

Inherited from Drop.valueOf

+

Defined in drop/drop.ts:2

+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_drop_.drop.html b/zh-cn/api/classes/drop_drop_.drop.html new file mode 100644 index 000000000..365dcedab --- /dev/null +++ b/zh-cn/api/classes/drop_drop_.drop.html @@ -0,0 +1,204 @@ + + + + + Class: Drop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Drop

+ + + +
+
+

Hierarchy

+

Methods

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

valueOf

valueOf(): any

+

Defined in drop/drop.ts:2

+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_empty_drop_.emptydrop.html b/zh-cn/api/classes/drop_empty_drop_.emptydrop.html new file mode 100644 index 000000000..e7db28c2c --- /dev/null +++ b/zh-cn/api/classes/drop_empty_drop_.emptydrop.html @@ -0,0 +1,240 @@ + + + + + Class: EmptyDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: EmptyDrop

+ + + +
+
+

Hierarchy

+

Implements

+

Methods

equals

equals(value: any): boolean

+

Defined in drop/empty-drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Defined in drop/empty-drop.ts:16

+

Returns: boolean

+
+

gt

gt(): boolean

+

Defined in drop/empty-drop.ts:13

+

Returns: boolean

+
+

leq

leq(): boolean

+

Defined in drop/empty-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Defined in drop/empty-drop.ts:19

+

Returns: boolean

+
+

valueOf

valueOf(): string

+

Overrides Drop.valueOf

+

Defined in drop/empty-drop.ts:25

+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_forloop_drop_.forloopdrop.html b/zh-cn/api/classes/drop_forloop_drop_.forloopdrop.html new file mode 100644 index 000000000..a3cd791f9 --- /dev/null +++ b/zh-cn/api/classes/drop_forloop_drop_.forloopdrop.html @@ -0,0 +1,253 @@ + + + + + Class: ForloopDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ForloopDrop

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new ForloopDrop(length: number): ForloopDrop

+

Defined in drop/forloop-drop.ts:5

+

Parameters:

+ + + + + + + + + + + +
NameType
lengthnumber
+

Returns: ForloopDrop

+

Properties

Protected i

i: number = 0

+

Defined in drop/forloop-drop.ts:4

+
+

length

length: number

+

Defined in drop/forloop-drop.ts:5

+

Methods

first

first(): boolean

+

Defined in drop/forloop-drop.ts:19

+

Returns: boolean

+
+

index

index(): number

+

Defined in drop/forloop-drop.ts:16

+

Returns: number

+
+

index0

index0(): number

+

Defined in drop/forloop-drop.ts:13

+

Returns: number

+
+

last

last(): boolean

+

Defined in drop/forloop-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

next

next(): void

+

Defined in drop/forloop-drop.ts:10

+

Returns: void

+
+

rindex

rindex(): number

+

Defined in drop/forloop-drop.ts:25

+

Returns: number

+
+

rindex0

rindex0(): number

+

Defined in drop/forloop-drop.ts:28

+

Returns: number

+
+

valueOf

valueOf(): string

+

Overrides Drop.valueOf

+

Defined in drop/forloop-drop.ts:31

+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_null_drop_.nulldrop.html b/zh-cn/api/classes/drop_null_drop_.nulldrop.html new file mode 100644 index 000000000..2737e624b --- /dev/null +++ b/zh-cn/api/classes/drop_null_drop_.nulldrop.html @@ -0,0 +1,239 @@ + + + + + Class: NullDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: NullDrop

+ + + +
+
+

Hierarchy

    +
  • Drop

    +

    NullDrop

    +
  • +
+

Implements

+

Methods

equals

equals(value: any): boolean

+

Defined in drop/null-drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

geq

geq(): boolean

+

Defined in drop/null-drop.ts:12

+

Returns: boolean

+
+

gt

gt(): boolean

+

Defined in drop/null-drop.ts:9

+

Returns: boolean

+
+

leq

leq(): boolean

+

Defined in drop/null-drop.ts:18

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

lt

lt(): boolean

+

Defined in drop/null-drop.ts:15

+

Returns: boolean

+
+

valueOf

valueOf(): null

+

Overrides Drop.valueOf

+

Defined in drop/null-drop.ts:21

+

Returns: null

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html b/zh-cn/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html new file mode 100644 index 000000000..2c3667286 --- /dev/null +++ b/zh-cn/api/classes/drop_tablerowloop_drop_.tablerowloopdrop.html @@ -0,0 +1,287 @@ + + + + + Class: TablerowloopDrop | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TablerowloopDrop

+ + + +
+
+

Hierarchy

ForloopDrop

+

TablerowloopDrop

+

Constructors

constructor

+ new TablerowloopDrop(length: number, cols: number): TablerowloopDrop

+

Overrides ForloopDrop.constructor

+

Defined in drop/tablerowloop-drop.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lengthnumber
colsnumber
+

Returns: TablerowloopDrop

+

Properties

Private cols

cols: number

+

Defined in drop/tablerowloop-drop.ts:4

+
+

Protected i

i: number = 0

+

Inherited from ForloopDrop.i

+

Defined in drop/forloop-drop.ts:4

+
+

length

length: number

+

Inherited from ForloopDrop.length

+

Defined in drop/forloop-drop.ts:5

+

Methods

col

col(): number

+

Defined in drop/tablerowloop-drop.ts:16

+

Returns: number

+
+

col0

col0(): number

+

Defined in drop/tablerowloop-drop.ts:13

+

Returns: number

+
+

col_first

col_first(): boolean

+

Defined in drop/tablerowloop-drop.ts:19

+

Returns: boolean

+
+

col_last

col_last(): boolean

+

Defined in drop/tablerowloop-drop.ts:22

+

Returns: boolean

+
+

first

first(): boolean

+

Inherited from ForloopDrop.first

+

Defined in drop/forloop-drop.ts:19

+

Returns: boolean

+
+

index

index(): number

+

Inherited from ForloopDrop.index

+

Defined in drop/forloop-drop.ts:16

+

Returns: number

+
+

index0

index0(): number

+

Inherited from ForloopDrop.index0

+

Defined in drop/forloop-drop.ts:13

+

Returns: number

+
+

last

last(): boolean

+

Inherited from ForloopDrop.last

+

Defined in drop/forloop-drop.ts:22

+

Returns: boolean

+
+

liquidMethodMissing

liquidMethodMissing(key: string): Promise‹string | undefined› | string | undefined

+

Inherited from Drop.liquidMethodMissing

+

Defined in drop/drop.ts:6

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: Promise‹string | undefined› | string | undefined

+
+

next

next(): void

+

Inherited from ForloopDrop.next

+

Defined in drop/forloop-drop.ts:10

+

Returns: void

+
+

rindex

rindex(): number

+

Inherited from ForloopDrop.rindex

+

Defined in drop/forloop-drop.ts:25

+

Returns: number

+
+

rindex0

rindex0(): number

+

Inherited from ForloopDrop.rindex0

+

Defined in drop/forloop-drop.ts:28

+

Returns: number

+
+

row

row(): number

+

Defined in drop/tablerowloop-drop.ts:10

+

Returns: number

+
+

valueOf

valueOf(): string

+

Inherited from ForloopDrop.valueOf

+

Overrides Drop.valueOf

+

Defined in drop/forloop-drop.ts:31

+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/liquid_.liquid.html b/zh-cn/api/classes/liquid_.liquid.html new file mode 100644 index 000000000..15fc45096 --- /dev/null +++ b/zh-cn/api/classes/liquid_.liquid.html @@ -0,0 +1,702 @@ + + + + + Class: Liquid | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Liquid

+ + + +
+
+

Hierarchy

    +
  • Liquid
  • +
+

Constructors

constructor

+ new Liquid(opts: LiquidOptions): Liquid

+

Defined in liquid.ts:26

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optsLiquidOptions{}
+

Returns: Liquid

+

Properties

filters

filters: FilterMap

+

Defined in liquid.ts:25

+
+

options

options: NormalizedFullOptions

+

Defined in liquid.ts:22

+
+

parser

parser: Parser

+

Defined in liquid.ts:24

+
+

renderer

renderer: Render

+

Defined in liquid.ts:23

+
+

tags

tags: TagMap

+

Defined in liquid.ts:26

+

Methods

_evalValue

_evalValue(str: string, ctx: Context): IterableIterator‹any›

+

Defined in liquid.ts:104

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: IterableIterator‹any›

+
+

_parseAndRender

_parseAndRender(html: string, scope?: undefined | object, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:57

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

_parseFile

_parseFile(file: string, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:68

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

_render

_render(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions, sync?: undefined | false | true): IterableIterator‹any›

+

Defined in liquid.ts:44

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
sync?undefined | false | true
+

Returns: IterableIterator‹any›

+
+

evalValue

evalValue(str: string, ctx: Context): Promise‹any›

+

Defined in liquid.ts:108

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: Promise‹any›

+
+

evalValueSync

evalValueSync(str: string, ctx: Context): any

+

Defined in liquid.ts:111

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
ctxContext
+

Returns: any

+
+

express

express(): (Anonymous function)

+

Defined in liquid.ts:124

+

Returns: (Anonymous function)

+
+

getTemplate

getTemplate(file: string, opts?: LiquidOptions): Promise‹Template[]›

+

Defined in liquid.ts:142

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Promise‹Template[]›

+
+

getTemplateSync

getTemplateSync(file: string, opts?: LiquidOptions): Template[]

+

Defined in liquid.ts:148

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Template[]

+
+

Private lookupError

lookupError(file: string, roots: string[]): any

+

Defined in liquid.ts:132

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
rootsstring[]
+

Returns: any

+
+

parse

parse(html: string, filepath?: undefined | string): Template[]

+

Defined in liquid.ts:38

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
htmlstring
filepath?undefined | string
+

Returns: Template[]

+
+

parseAndRender

parseAndRender(html: string, scope?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:61

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

parseAndRenderSync

parseAndRenderSync(html: string, scope?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:64

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
htmlstring
scope?undefined | object
opts?LiquidOptions
+

Returns: any

+
+

parseFile

parseFile(file: string, opts?: LiquidOptions): Promise‹Template[]›

+

Defined in liquid.ts:89

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Promise‹Template[]›

+
+

parseFileSync

parseFileSync(file: string, opts?: LiquidOptions): Template[]

+

Defined in liquid.ts:92

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
filestring
opts?LiquidOptions
+

Returns: Template[]

+
+

plugin

plugin(plugin: function): void

+

Defined in liquid.ts:121

+

Parameters:

+

plugin: function

+

▸ (this: Liquid, L: Liquid): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
thisLiquid
LLiquid
+

Returns: void

+
+

registerFilter

registerFilter(name: string, filter: FilterImplOptions): void

+

Defined in liquid.ts:115

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
filterFilterImplOptions
+

Returns: void

+
+

registerTag

registerTag(name: string, tag: TagImplOptions): void

+

Defined in liquid.ts:118

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
tagTagImplOptions
+

Returns: void

+
+

render

render(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:50

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

renderFile

renderFile(file: string, ctx?: undefined | object, opts?: LiquidOptions): Promise‹any›

+

Defined in liquid.ts:95

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
ctx?undefined | object
opts?LiquidOptions
+

Returns: Promise‹any›

+
+

renderFileSync

renderFileSync(file: string, ctx?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:99

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
filestring
ctx?undefined | object
opts?LiquidOptions
+

Returns: any

+
+

renderSync

renderSync(tpl: Template[], scope?: undefined | object, opts?: LiquidOptions): any

+

Defined in liquid.ts:53

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tplTemplate[]
scope?undefined | object
opts?LiquidOptions
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/parser_parse_stream_.parsestream.html b/zh-cn/api/classes/parser_parse_stream_.parsestream.html new file mode 100644 index 000000000..30355bfc1 --- /dev/null +++ b/zh-cn/api/classes/parser_parse_stream_.parsestream.html @@ -0,0 +1,281 @@ + + + + + Class: ParseStream <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ParseStream <T>

+ + + +
+
+

Type parameters

T: Token

+

Hierarchy

    +
  • ParseStream
  • +
+

Constructors

constructor

+ new ParseStream(tokens: T[], parseToken: ParseToken‹T›): ParseStream

+

Defined in parser/parse-stream.ts:12

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokensT[]
parseTokenParseToken‹T›
+

Returns: ParseStream

+

Properties

Private handlers

handlers: object

+

Defined in parser/parse-stream.ts:10

+

Type declaration:

    +
  • [ key: string]: function
  • +
+

▸ (arg: any): void

+

Parameters:

+ + + + + + + + + + + +
NameType
argany
+
+

Private parseToken

parseToken: ParseToken‹T›

+

Defined in parser/parse-stream.ts:12

+
+

Private stopRequested

stopRequested: boolean = false

+

Defined in parser/parse-stream.ts:11

+
+

Private tokens

tokens: T[]

+

Defined in parser/parse-stream.ts:9

+

Methods

on

on<T2>(name: string, cb: function): ParseStream‹T›

+

Defined in parser/parse-stream.ts:18

+

Type parameters:

+

T2: Template | T | undefined

+

Parameters:

+

name: string

+

cb: function

+

▸ (arg: T2): void

+

Parameters:

+ + + + + + + + + + + +
NameType
argT2
+

Returns: ParseStream‹T›

+
+

start

start(): this

+

Defined in parser/parse-stream.ts:26

+

Returns: this

+
+

stop

stop(): this

+

Defined in parser/parse-stream.ts:40

+

Returns: this

+
+

Private trigger

trigger<T>(event: string, arg?: T): boolean

+

Defined in parser/parse-stream.ts:22

+

Type parameters:

+

T: Token | Template

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
eventstring
arg?T
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/parser_parser_.parser.html b/zh-cn/api/classes/parser_parser_.parser.html new file mode 100644 index 000000000..6aee2aec0 --- /dev/null +++ b/zh-cn/api/classes/parser_parser_.parser.html @@ -0,0 +1,251 @@ + + + + + Class: Parser | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Parser

+ + + +
+
+

Hierarchy

    +
  • Parser
  • +
+

Constructors

constructor

+ new Parser(liquid: Liquid): Parser

+

Defined in parser/parser.ts:13

+

Parameters:

+ + + + + + + + + + + +
NameType
liquidLiquid
+

Returns: Parser

+

Properties

Private liquid

liquid: Liquid

+

Defined in parser/parser.ts:13

+

Methods

parse

parse(tokens: TopLevelToken[]): Template[]

+

Defined in parser/parser.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensTopLevelToken[]
+

Returns: Template[]

+
+

parseStream

parseStream(tokens: TopLevelToken[]): ParseStreamTagToken | HTMLToken | OutputToken

+

Defined in parser/parser.ts:39

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensTopLevelToken[]
+

Returns: ParseStreamTagToken | HTMLToken | OutputToken

+
+

parseToken

parseToken(token: TopLevelToken, remainTokens: TopLevelToken[]): Tag | Output | HTML

+

Defined in parser/parser.ts:26

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenTopLevelToken
remainTokensTopLevelToken[]
+

Returns: Tag | Output | HTML

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/parser_tokenizer_.tokenizer.html b/zh-cn/api/classes/parser_tokenizer_.tokenizer.html new file mode 100644 index 000000000..9b75b9a00 --- /dev/null +++ b/zh-cn/api/classes/parser_tokenizer_.tokenizer.html @@ -0,0 +1,568 @@ + + + + + Class: Tokenizer | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Tokenizer

+ + + +
+
+

Hierarchy

    +
  • Tokenizer
  • +
+

Constructors

constructor

+ new Tokenizer(input: string, trie: Trie, file: string): Tokenizer

+

Defined in parser/tokenizer.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
inputstring-
trieTrie-
filestring“”
+

Returns: Tokenizer

+

Properties

N

N: number

+

Defined in parser/tokenizer.ts:30

+
+

Private file

file: string

+

Defined in parser/tokenizer.ts:36

+
+

Private input

input: string

+

Defined in parser/tokenizer.ts:34

+
+

p

p: number = 0

+

Defined in parser/tokenizer.ts:29

+
+

Private rawBeginAt

rawBeginAt: number = -1

+

Defined in parser/tokenizer.ts:31

+
+

Private trie

trie: Trie

+

Defined in parser/tokenizer.ts:35

+

Methods

advance

advance(i: number): void

+

Defined in parser/tokenizer.ts:248

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
inumber1
+

Returns: void

+
+

end

end(): boolean

+

Defined in parser/tokenizer.ts:252

+

Returns: boolean

+
+

match

match(word: string): boolean

+

Defined in parser/tokenizer.ts:343

+

Parameters:

+ + + + + + + + + + + +
NameType
wordstring
+

Returns: boolean

+
+

mkError

mkError(msg: string, begin: number): TokenizationError

+

Defined in parser/tokenizer.ts:196

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
msgstring
beginnumber
+

Returns: TokenizationError

+
+

peek

peek(n: number): string

+

Defined in parser/tokenizer.ts:361

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
nnumber0
+

Returns: string

+
+

peekType

peekType(n: number): number

+

Defined in parser/tokenizer.ts:357

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
nnumber0
+

Returns: number

+
+

readEndrawOrRawContent

readEndrawOrRawContent(options: NormalizedFullOptions): HTMLToken | TagToken

+

Defined in parser/tokenizer.ts:169

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: HTMLToken | TagToken

+
+

readExpression

readExpression(): Expression

+

Defined in parser/tokenizer.ts:41

+

Returns: Expression

+
+

readExpressionTokens

readExpressionTokens(): IterableIterator‹Token

+

Defined in parser/tokenizer.ts:45

+

Returns: IterableIterator‹Token

+
+

readFileName

readFileName(): IdentifierToken

+

Defined in parser/tokenizer.ts:337

+

Returns: IdentifierToken

+
+

readFilter

readFilter(): FilterToken | null

+

Defined in parser/tokenizer.ts:76

+

Returns: FilterToken | null

+
+

readFilterArg

readFilterArg(): FilterArg | undefined

+

Defined in parser/tokenizer.ts:97

+

Returns: FilterArg | undefined

+
+

readFilters

readFilters(): FilterToken[]

+

Defined in parser/tokenizer.ts:68

+

Returns: FilterToken[]

+
+

readHTMLToken

readHTMLToken(options: NormalizedFullOptions): HTMLToken

+

Defined in parser/tokenizer.ts:125

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: HTMLToken

+
+

readHash

readHash(): HashToken | undefined

+

Defined in parser/tokenizer.ts:228

+

Returns: HashToken | undefined

+
+

readHashes

readHashes(): HashToken[]

+

Defined in parser/tokenizer.ts:219

+

Returns: HashToken[]

+
+

readIdentifier

readIdentifier(): IdentifierToken

+

Defined in parser/tokenizer.ts:212

+

Returns: IdentifierToken

+
+

readOperator

readOperator(): OperatorToken | undefined

+

Defined in parser/tokenizer.ts:62

+

Returns: OperatorToken | undefined

+
+

readOutputToken

readOutputToken(options: NormalizedFullOptions): OutputToken

+

Defined in parser/tokenizer.ts:159

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: OutputToken

+
+

readQuoted

readQuoted(): QuotedToken | undefined

+

Defined in parser/tokenizer.ts:322

+

Returns: QuotedToken | undefined

+
+

readRange

readRange(): RangeToken | undefined

+

Defined in parser/tokenizer.ts:304

+

Returns: RangeToken | undefined

+
+

readTagToken

readTagToken(options: NormalizedFullOptions): TagToken

+

Defined in parser/tokenizer.ts:136

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: TagToken

+
+

readTo

readTo(end: string): number

+

Defined in parser/tokenizer.ts:256

+

Parameters:

+ + + + + + + + + + + +
NameType
endstring
+

Returns: number

+
+

readToDelimiter

readToDelimiter(delimiter: string): number

+

Defined in parser/tokenizer.ts:147

+

Parameters:

+ + + + + + + + + + + +
NameType
delimiterstring
+

Returns: number

+
+

readTopLevelToken

readTopLevelToken(options: NormalizedFullOptions): TopLevelToken

+

Defined in parser/tokenizer.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedFullOptions
+

Returns: TopLevelToken

+
+

readTopLevelTokens

readTopLevelTokens(options: NormalizedFullOptions): TopLevelToken[]

+

Defined in parser/tokenizer.ts:107

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
optionsNormalizedFullOptionsdefaultOptions
+

Returns: TopLevelToken[]

+
+

readValue

readValue(): ValueToken | undefined

+

Defined in parser/tokenizer.ts:264

+

Returns: ValueToken | undefined

+
+

readValueOrThrow

readValueOrThrow(): ValueToken

+

Defined in parser/tokenizer.ts:316

+

Returns: ValueToken

+
+

readWord

readWord(): IdentifierToken

+

Defined in parser/tokenizer.ts:207

+

Returns: IdentifierToken

+
+

remaining

remaining(): string

+

Defined in parser/tokenizer.ts:244

+

Returns: string

+
+

rmatch

rmatch(pattern: string): boolean

+

Defined in parser/tokenizer.ts:350

+

Parameters:

+ + + + + + + + + + + +
NameType
patternstring
+

Returns: boolean

+
+

skipBlank

skipBlank(): void

+

Defined in parser/tokenizer.ts:365

+

Returns: void

+
+

snapshot

snapshot(begin: number): string

+

Defined in parser/tokenizer.ts:200

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
beginnumberthis.p
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/render_emitter_.emitter.html b/zh-cn/api/classes/render_emitter_.emitter.html new file mode 100644 index 000000000..638a68e46 --- /dev/null +++ b/zh-cn/api/classes/render_emitter_.emitter.html @@ -0,0 +1,222 @@ + + + + + Class: Emitter | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Emitter

+ + + +
+
+

Hierarchy

    +
  • Emitter
  • +
+

Constructors

constructor

+ new Emitter(keepOutputType: boolean | undefined): Emitter

+

Defined in render/emitter.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
keepOutputTypeboolean | undefined
+

Returns: Emitter

+

Properties

break

break: boolean = false

+

Defined in render/emitter.ts:5

+
+

continue

continue: boolean = false

+

Defined in render/emitter.ts:6

+
+

html

html: any = “”

+

Defined in render/emitter.ts:4

+
+

Private Optional keepOutputType

keepOutputType? : undefined | false | true = false

+

Defined in render/emitter.ts:7

+

Methods

write

write(html: any): void

+

Defined in render/emitter.ts:13

+

Parameters:

+ + + + + + + + + + + +
NameType
htmlany
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/render_expression_.expression.html b/zh-cn/api/classes/render_expression_.expression.html new file mode 100644 index 000000000..0cfc0f791 --- /dev/null +++ b/zh-cn/api/classes/render_expression_.expression.html @@ -0,0 +1,217 @@ + + + + + Class: Expression | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Expression

+ + + +
+
+

Hierarchy

    +
  • Expression
  • +
+

Constructors

constructor

+ new Expression(tokens: IterableIterator‹Token›): Expression

+

Defined in render/expression.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensIterableIterator‹Token
+

Returns: Expression

+

Properties

Private postfix

postfix: Token[]

+

Defined in render/expression.ts:18

+

Methods

evaluate

evaluate(ctx: Context, lenient: boolean): any

+

Defined in render/expression.ts:23

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
lenientboolean
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/render_render_.render.html b/zh-cn/api/classes/render_render_.render.html new file mode 100644 index 000000000..bc0dd5d17 --- /dev/null +++ b/zh-cn/api/classes/render_render_.render.html @@ -0,0 +1,203 @@ + + + + + Class: Render | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_filter_filter_.filter.html b/zh-cn/api/classes/template_filter_filter_.filter.html new file mode 100644 index 000000000..24cd13cb4 --- /dev/null +++ b/zh-cn/api/classes/template_filter_filter_.filter.html @@ -0,0 +1,238 @@ + + + + + Class: Filter | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Filter

+ + + +
+
+

Hierarchy

    +
  • Filter
  • +
+

Constructors

constructor

+ new Filter(name: string, impl: FilterImplOptions, args: FilterArg[], liquid: Liquid): Filter

+

Defined in template/filter/filter.ts:12

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
namestring
implFilterImplOptions
argsFilterArg[]
liquidLiquid
+

Returns: Filter

+

Properties

args

args: FilterArg[]

+

Defined in template/filter/filter.ts:10

+
+

Private impl

impl: FilterImplOptions

+

Defined in template/filter/filter.ts:11

+
+

Private liquid

liquid: Liquid

+

Defined in template/filter/filter.ts:12

+
+

name

name: string

+

Defined in template/filter/filter.ts:9

+

Methods

render

render(value: any, context: Context): any

+

Defined in template/filter/filter.ts:20

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valueany
contextContext
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_filter_filter_map_.filtermap.html b/zh-cn/api/classes/template_filter_filter_map_.filtermap.html new file mode 100644 index 000000000..62113ffa8 --- /dev/null +++ b/zh-cn/api/classes/template_filter_filter_map_.filtermap.html @@ -0,0 +1,268 @@ + + + + + Class: FilterMap | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: FilterMap

+ + + +
+
+

Hierarchy

    +
  • FilterMap
  • +
+

Constructors

constructor

+ new FilterMap(strictFilters: boolean, liquid: Liquid): FilterMap

+

Defined in template/filter/filter-map.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strictFiltersboolean
liquidLiquid
+

Returns: FilterMap

+

Properties

Private impls

impls: object

+

Defined in template/filter/filter-map.ts:8

+

Type declaration:

+
+

Private liquid

liquid: Liquid

+

Defined in template/filter/filter-map.ts:12

+
+

Private strictFilters

strictFilters: boolean

+

Defined in template/filter/filter-map.ts:11

+

Methods

create

create(name: string, args: FilterArg[]): Filter

+

Defined in template/filter/filter-map.ts:25

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
argsFilterArg[]
+

Returns: Filter

+
+

get

get(name: string): FilterImplOptions

+

Defined in template/filter/filter-map.ts:15

+

Parameters:

+ + + + + + + + + + + +
NameType
namestring
+

Returns: FilterImplOptions

+
+

set

set(name: string, impl: FilterImplOptions): void

+

Defined in template/filter/filter-map.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
implFilterImplOptions
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_html_.html.html b/zh-cn/api/classes/template_html_.html.html new file mode 100644 index 000000000..d455acafc --- /dev/null +++ b/zh-cn/api/classes/template_html_.html.html @@ -0,0 +1,229 @@ + + + + + Class: HTML | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HTML

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new HTML(token: HTMLToken): HTML

+

Overrides TemplateImpl.constructor

+

Defined in template/html.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenHTMLToken
+

Returns: HTML

+

Properties

Private str

str: string

+

Defined in template/html.ts:8

+
+

token

token: HTMLToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹void›

+

Implementation of Template

+

Defined in template/html.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹void›

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_output_.output.html b/zh-cn/api/classes/template_output_.output.html new file mode 100644 index 000000000..5918057dd --- /dev/null +++ b/zh-cn/api/classes/template_output_.output.html @@ -0,0 +1,233 @@ + + + + + Class: Output | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Output

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new Output(token: OutputToken, liquid: Liquid): Output

+

Overrides TemplateImpl.constructor

+

Defined in template/output.ts:10

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenOutputToken
liquidLiquid
+

Returns: Output

+

Properties

token

token: OutputToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+
+

Private value

value: Value

+

Defined in template/output.ts:10

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹IterableIterator‹any››

+

Implementation of Template

+

Defined in template/output.ts:15

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹IterableIterator‹any››

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_tag_hash_.hash.html b/zh-cn/api/classes/template_tag_hash_.hash.html new file mode 100644 index 000000000..fe37216d4 --- /dev/null +++ b/zh-cn/api/classes/template_tag_hash_.hash.html @@ -0,0 +1,216 @@ + + + + + Class: Hash | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Hash

+ + + +
+
+

Hierarchy

    +
  • Hash
  • +
+

Constructors

constructor

+ new Hash(markup: string): Hash

+

Defined in template/tag/hash.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
markupstring
+

Returns: Hash

+

Properties

hash

hash: object

+

Defined in template/tag/hash.ts:14

+

Type declaration:

    +
  • [ key: string]: any
  • +
+

Methods

render

render(ctx: Context): IterableIterator‹any›

+

Defined in template/tag/hash.ts:21

+

Parameters:

+ + + + + + + + + + + +
NameType
ctxContext
+

Returns: IterableIterator‹any›

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_tag_tag_.tag.html b/zh-cn/api/classes/template_tag_tag_.tag.html new file mode 100644 index 000000000..1ccd8bf44 --- /dev/null +++ b/zh-cn/api/classes/template_tag_tag_.tag.html @@ -0,0 +1,240 @@ + + + + + Class: Tag | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Tag

+ + + +
+
+

Hierarchy

+

Implements

+

Constructors

constructor

+ new Tag(token: TagToken, tokens: TopLevelToken[], liquid: Liquid): Tag

+

Overrides TemplateImpl.constructor

+

Defined in template/tag/tag.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tokenTagToken
tokensTopLevelToken[]
liquidLiquid
+

Returns: Tag

+

Properties

Private impl

impl: TagImpl

+

Defined in template/tag/tag.ts:9

+
+

name

name: string

+

Defined in template/tag/tag.ts:8

+
+

token

token: TagToken

+

Implementation of Template.token

+

Inherited from TemplateImpl.token

+

Defined in template/template-impl.ts:2

+

Methods

render

render(ctx: Context, emitter: Emitter): IterableIterator‹any›

+

Implementation of Template

+

Defined in template/tag/tag.ts:23

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
emitterEmitter
+

Returns: IterableIterator‹any›

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_tag_tag_map_.tagmap.html b/zh-cn/api/classes/template_tag_tag_map_.tagmap.html new file mode 100644 index 000000000..172c2de5e --- /dev/null +++ b/zh-cn/api/classes/template_tag_tag_map_.tagmap.html @@ -0,0 +1,221 @@ + + + + + Class: TagMap | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TagMap

+ + + +
+
+

Hierarchy

    +
  • TagMap
  • +
+

Properties

Private impls

impls: object

+

Defined in template/tag/tag-map.ts:5

+

Type declaration:

+

Methods

get

get(name: string): TagImplOptions

+

Defined in template/tag/tag-map.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
namestring
+

Returns: TagImplOptions

+
+

set

set(name: string, impl: TagImplOptions): void

+

Defined in template/tag/tag-map.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
namestring
implTagImplOptions
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_template_impl_.templateimpl.html b/zh-cn/api/classes/template_template_impl_.templateimpl.html new file mode 100644 index 000000000..b1829f438 --- /dev/null +++ b/zh-cn/api/classes/template_template_impl_.templateimpl.html @@ -0,0 +1,202 @@ + + + + + Class: TemplateImpl <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/template_value_.value.html b/zh-cn/api/classes/template_value_.value.html new file mode 100644 index 000000000..07add85bc --- /dev/null +++ b/zh-cn/api/classes/template_value_.value.html @@ -0,0 +1,227 @@ + + + + + Class: Value | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Value

+ + + +
+
+

Hierarchy

    +
  • Value
  • +
+

Constructors

constructor

+ new Value(str: string, liquid: Liquid): Value

+

Defined in template/value.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
strstringthe value to be valuated, eg.: “foobar”
liquidLiquid-
+

Returns: Value

+

Properties

filters

filters: Filter[] = []

+

Defined in template/value.ts:8

+
+

initial

initial: Expression

+

Defined in template/value.ts:9

+

Methods

value

value(ctx: Context, lenient: boolean): IterableIterator‹any›

+

Defined in template/value.ts:19

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
ctxContext
lenientboolean
+

Returns: IterableIterator‹any›

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_delimited_token_.delimitedtoken.html b/zh-cn/api/classes/tokens_delimited_token_.delimitedtoken.html new file mode 100644 index 000000000..7ced49c37 --- /dev/null +++ b/zh-cn/api/classes/tokens_delimited_token_.delimitedtoken.html @@ -0,0 +1,270 @@ + + + + + Class: DelimitedToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: DelimitedToken

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new DelimitedToken(kind: TokenKind, content: string, input: string, begin: number, end: number, trimLeft: boolean, trimRight: boolean, file?: undefined | string): DelimitedToken

+

Overrides Token.constructor

+

Defined in tokens/delimited-token.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
kindTokenKind
contentstring
inputstring
beginnumber
endnumber
trimLeftboolean
trimRightboolean
file?undefined | string
+

Returns: DelimitedToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: boolean = false

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_filter_token_.filtertoken.html b/zh-cn/api/classes/tokens_filter_token_.filtertoken.html new file mode 100644 index 000000000..8fc82af04 --- /dev/null +++ b/zh-cn/api/classes/tokens_filter_token_.filtertoken.html @@ -0,0 +1,257 @@ + + + + + Class: FilterToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: FilterToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    FilterToken

    +
  • +
+

Constructors

constructor

+ new FilterToken(name: string, args: FilterArg[], input: string, begin: number, end: number, file?: undefined | string): FilterToken

+

Overrides Token.constructor

+

Defined in tokens/filter-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
namestring
argsFilterArg[]
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: FilterToken

+

Properties

args

args: FilterArg[]

+

Defined in tokens/filter-token.ts:8

+
+

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: string

+

Defined in tokens/filter-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_hash_token_.hashtoken.html b/zh-cn/api/classes/tokens_hash_token_.hashtoken.html new file mode 100644 index 000000000..6607d66e4 --- /dev/null +++ b/zh-cn/api/classes/tokens_hash_token_.hashtoken.html @@ -0,0 +1,257 @@ + + + + + Class: HashToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HashToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    HashToken

    +
  • +
+

Constructors

constructor

+ new HashToken(input: string, begin: number, end: number, name: IdentifierToken, value?: ValueToken, file?: undefined | string): HashToken

+

Overrides Token.constructor

+

Defined in tokens/hash-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
nameIdentifierToken
value?ValueToken
file?undefined | string
+

Returns: HashToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/hash-token.ts:9

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/hash-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/hash-token.ts:13

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/hash-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: IdentifierToken

+

Defined in tokens/hash-token.ts:11

+
+

Optional value

value? : ValueToken

+

Defined in tokens/hash-token.ts:12

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_html_token_.htmltoken.html b/zh-cn/api/classes/tokens_html_token_.htmltoken.html new file mode 100644 index 000000000..5aab14456 --- /dev/null +++ b/zh-cn/api/classes/tokens_html_token_.htmltoken.html @@ -0,0 +1,253 @@ + + + + + Class: HTMLToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: HTMLToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    HTMLToken

    +
  • +
+

Constructors

constructor

+ new HTMLToken(input: string, begin: number, end: number, file?: undefined | string): HTMLToken

+

Overrides Token.constructor

+

Defined in tokens/html-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: HTMLToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/html-token.ts:9

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/html-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/html-token.ts:11

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/html-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: number = 0

+

Defined in tokens/html-token.ts:5

+
+

trimRight

trimRight: number = 0

+

Defined in tokens/html-token.ts:6

+

Methods

getContent

getContent(): string

+

Defined in tokens/html-token.ts:15

+

Returns: string

+
+

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_identifier_token_.identifiertoken.html b/zh-cn/api/classes/tokens_identifier_token_.identifiertoken.html new file mode 100644 index 000000000..dac0a9043 --- /dev/null +++ b/zh-cn/api/classes/tokens_identifier_token_.identifiertoken.html @@ -0,0 +1,265 @@ + + + + + Class: IdentifierToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: IdentifierToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    IdentifierToken

    +
  • +
+

Constructors

constructor

+ new IdentifierToken(input: string, begin: number, end: number, file?: undefined | string): IdentifierToken

+

Overrides Token.constructor

+

Defined in tokens/identifier-token.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: IdentifierToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/identifier-token.ts:9

+
+

content

content: string

+

Defined in tokens/identifier-token.ts:6

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/identifier-token.ts:10

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/identifier-token.ts:11

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/identifier-token.ts:8

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

isNumber

isNumber(allowSign: boolean): boolean

+

Defined in tokens/identifier-token.ts:16

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDefault
allowSignbooleanfalse
+

Returns: boolean

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_literal_token_.literaltoken.html b/zh-cn/api/classes/tokens_literal_token_.literaltoken.html new file mode 100644 index 000000000..d51e434a8 --- /dev/null +++ b/zh-cn/api/classes/tokens_literal_token_.literaltoken.html @@ -0,0 +1,246 @@ + + + + + Class: LiteralToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LiteralToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    LiteralToken

    +
  • +
+

Constructors

constructor

+ new LiteralToken(input: string, begin: number, end: number, file?: undefined | string): LiteralToken

+

Overrides Token.constructor

+

Defined in tokens/literal-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: LiteralToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/literal-token.ts:8

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/literal-token.ts:9

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/literal-token.ts:10

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/literal-token.ts:7

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

literal

literal: string

+

Defined in tokens/literal-token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_number_token_.numbertoken.html b/zh-cn/api/classes/tokens_number_token_.numbertoken.html new file mode 100644 index 000000000..2be95abd8 --- /dev/null +++ b/zh-cn/api/classes/tokens_number_token_.numbertoken.html @@ -0,0 +1,241 @@ + + + + + Class: NumberToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: NumberToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    NumberToken

    +
  • +
+

Constructors

constructor

+ new NumberToken(whole: IdentifierToken, decimal?: IdentifierToken): NumberToken

+

Overrides Token.constructor

+

Defined in tokens/number-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
wholeIdentifierToken
decimal?IdentifierToken
+

Returns: NumberToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

Optional decimal

decimal? : IdentifierToken

+

Defined in tokens/number-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

whole

whole: IdentifierToken

+

Defined in tokens/number-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_operator_token_.operatortoken.html b/zh-cn/api/classes/tokens_operator_token_.operatortoken.html new file mode 100644 index 000000000..03dfd1f28 --- /dev/null +++ b/zh-cn/api/classes/tokens_operator_token_.operatortoken.html @@ -0,0 +1,250 @@ + + + + + Class: OperatorToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: OperatorToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    OperatorToken

    +
  • +
+

Constructors

constructor

+ new OperatorToken(input: string, begin: number, end: number, file?: undefined | string): OperatorToken

+

Overrides Token.constructor

+

Defined in tokens/operator-token.ts:17

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: OperatorToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/operator-token.ts:20

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/operator-token.ts:21

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/operator-token.ts:22

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/operator-token.ts:19

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

operator

operator: string

+

Defined in tokens/operator-token.ts:17

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getPrecedence

getPrecedence(): any

+

Defined in tokens/operator-token.ts:27

+

Returns: any

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_output_token_.outputtoken.html b/zh-cn/api/classes/tokens_output_token_.outputtoken.html new file mode 100644 index 000000000..66682dff7 --- /dev/null +++ b/zh-cn/api/classes/tokens_output_token_.outputtoken.html @@ -0,0 +1,256 @@ + + + + + Class: OutputToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: OutputToken

+ + + +
+
+

Hierarchy

DelimitedToken

+

OutputToken

+

Constructors

constructor

+ new OutputToken(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: undefined | string): OutputToken

+

Overrides DelimitedToken.constructor

+

Defined in tokens/output-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
optionsNormalizedFullOptions
file?undefined | string
+

Returns: OutputToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Inherited from DelimitedToken.content

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

trimLeft

trimLeft: boolean = false

+

Inherited from DelimitedToken.trimLeft

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Inherited from DelimitedToken.trimRight

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_property_access_token_.propertyaccesstoken.html b/zh-cn/api/classes/tokens_property_access_token_.propertyaccesstoken.html new file mode 100644 index 000000000..aa0feb08c --- /dev/null +++ b/zh-cn/api/classes/tokens_property_access_token_.propertyaccesstoken.html @@ -0,0 +1,249 @@ + + + + + Class: PropertyAccessToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: PropertyAccessToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    PropertyAccessToken

    +
  • +
+

Constructors

constructor

+ new PropertyAccessToken(variable: IdentifierToken | QuotedToken, props: IdentifierToken | QuotedToken | PropertyAccessToken[], end: number): PropertyAccessToken

+

Overrides Token.constructor

+

Defined in tokens/property-access-token.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
variableIdentifierToken | QuotedToken
propsIdentifierToken | QuotedToken | PropertyAccessToken[]
endnumber
+

Returns: PropertyAccessToken

+

Properties

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

props

props: IdentifierToken | QuotedToken | PropertyAccessToken[]

+

Defined in tokens/property-access-token.ts:10

+
+

variable

variable: IdentifierToken | QuotedToken

+

Defined in tokens/property-access-token.ts:9

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

getVariableAsText

getVariableAsText(): string

+

Defined in tokens/property-access-token.ts:16

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_quoted_token_.quotedtoken.html b/zh-cn/api/classes/tokens_quoted_token_.quotedtoken.html new file mode 100644 index 000000000..06633155e --- /dev/null +++ b/zh-cn/api/classes/tokens_quoted_token_.quotedtoken.html @@ -0,0 +1,243 @@ + + + + + Class: QuotedToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: QuotedToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    QuotedToken

    +
  • +
+

Constructors

constructor

+ new QuotedToken(input: string, begin: number, end: number, file?: undefined | string): QuotedToken

+

Overrides Token.constructor

+

Defined in tokens/quoted-token.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: QuotedToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/quoted-token.ts:7

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/quoted-token.ts:8

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/quoted-token.ts:9

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/quoted-token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_range_token_.rangetoken.html b/zh-cn/api/classes/tokens_range_token_.rangetoken.html new file mode 100644 index 000000000..71df98622 --- /dev/null +++ b/zh-cn/api/classes/tokens_range_token_.rangetoken.html @@ -0,0 +1,257 @@ + + + + + Class: RangeToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: RangeToken

+ + + +
+
+

Hierarchy

    +
  • Token

    +

    RangeToken

    +
  • +
+

Constructors

constructor

+ new RangeToken(input: string, begin: number, end: number, lhs: ValueToken, rhs: ValueToken, file?: undefined | string): RangeToken

+

Overrides Token.constructor

+

Defined in tokens/range-token.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
lhsValueToken
rhsValueToken
file?undefined | string
+

Returns: RangeToken

+

Properties

begin

begin: number

+

Overrides Token.begin

+

Defined in tokens/range-token.ts:8

+
+

end

end: number

+

Overrides Token.end

+

Defined in tokens/range-token.ts:9

+
+

Optional file

file? : undefined | string

+

Overrides Token.file

+

Defined in tokens/range-token.ts:12

+
+

input

input: string

+

Overrides Token.input

+

Defined in tokens/range-token.ts:7

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

lhs

lhs: ValueToken

+

Defined in tokens/range-token.ts:10

+
+

rhs

rhs: ValueToken

+

Defined in tokens/range-token.ts:11

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_tag_token_.tagtoken.html b/zh-cn/api/classes/tokens_tag_token_.tagtoken.html new file mode 100644 index 000000000..9f93bd1b0 --- /dev/null +++ b/zh-cn/api/classes/tokens_tag_token_.tagtoken.html @@ -0,0 +1,262 @@ + + + + + Class: TagToken | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TagToken

+ + + +
+
+

Hierarchy

DelimitedToken

+

TagToken

+

Constructors

constructor

+ new TagToken(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: undefined | string): TagToken

+

Overrides DelimitedToken.constructor

+

Defined in tokens/tag-token.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
inputstring
beginnumber
endnumber
optionsNormalizedFullOptions
file?undefined | string
+

Returns: TagToken

+

Properties

args

args: string

+

Defined in tokens/tag-token.ts:9

+
+

begin

begin: number

+

Inherited from Token.begin

+

Defined in tokens/token.ts:7

+
+

content

content: string

+

Inherited from DelimitedToken.content

+

Defined in tokens/delimited-token.ts:8

+
+

end

end: number

+

Inherited from Token.end

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Inherited from Token.file

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Inherited from Token.input

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Inherited from Token.kind

+

Defined in tokens/token.ts:5

+
+

name

name: string

+

Defined in tokens/tag-token.ts:8

+
+

trimLeft

trimLeft: boolean = false

+

Inherited from DelimitedToken.trimLeft

+

Defined in tokens/delimited-token.ts:6

+
+

trimRight

trimRight: boolean = false

+

Inherited from DelimitedToken.trimRight

+

Defined in tokens/delimited-token.ts:7

+

Methods

getPosition

getPosition(): number[]

+

Inherited from Token.getPosition

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Inherited from Token.getText

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Inherited from Token.size

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/tokens_token_.token.html b/zh-cn/api/classes/tokens_token_.token.html new file mode 100644 index 000000000..f243841d7 --- /dev/null +++ b/zh-cn/api/classes/tokens_token_.token.html @@ -0,0 +1,248 @@ + + + + + Class: Token | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: Token

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new Token(kind: TokenKind, input: string, begin: number, end: number, file?: undefined | string): Token

+

Defined in tokens/token.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
kindTokenKind
inputstring
beginnumber
endnumber
file?undefined | string
+

Returns: Token

+

Properties

begin

begin: number

+

Defined in tokens/token.ts:7

+
+

end

end: number

+

Defined in tokens/token.ts:8

+
+

Optional file

file? : undefined | string

+

Defined in tokens/token.ts:9

+
+

input

input: string

+

Defined in tokens/token.ts:6

+
+

kind

kind: TokenKind

+

Defined in tokens/token.ts:5

+

Methods

getPosition

getPosition(): number[]

+

Defined in tokens/token.ts:14

+

Returns: number[]

+
+

getText

getText(): string

+

Defined in tokens/token.ts:11

+

Returns: string

+
+

size

size(): number

+

Defined in tokens/token.ts:24

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.assertionerror.html b/zh-cn/api/classes/util_error_.assertionerror.html new file mode 100644 index 000000000..2c6f069ae --- /dev/null +++ b/zh-cn/api/classes/util_error_.assertionerror.html @@ -0,0 +1,212 @@ + + + + + Class: AssertionError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: AssertionError

+ + + +
+
+

Hierarchy

    +
  • Error

    +

    AssertionError

    +
  • +
+

Constructors

constructor

+ new AssertionError(message: string): AssertionError

+

Defined in util/error.ts:74

+

Parameters:

+ + + + + + + + + + + +
NameType
messagestring
+

Returns: AssertionError

+

Properties

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.internalundefinedvariableerror.html b/zh-cn/api/classes/util_error_.internalundefinedvariableerror.html new file mode 100644 index 000000000..1d3227ca1 --- /dev/null +++ b/zh-cn/api/classes/util_error_.internalundefinedvariableerror.html @@ -0,0 +1,215 @@ + + + + + Class: InternalUndefinedVariableError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: InternalUndefinedVariableError

+ + + +
+
+

Hierarchy

    +
  • Error

    +

    InternalUndefinedVariableError

    +
  • +
+

Constructors

constructor

+ new InternalUndefinedVariableError(variableName: string): InternalUndefinedVariableError

+

Defined in util/error.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
variableNamestring
+

Returns: InternalUndefinedVariableError

+

Properties

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

variableName

variableName: string

+

Defined in util/error.ts:65

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.liquiderror.html b/zh-cn/api/classes/util_error_.liquiderror.html new file mode 100644 index 000000000..f42ca6f43 --- /dev/null +++ b/zh-cn/api/classes/util_error_.liquiderror.html @@ -0,0 +1,232 @@ + + + + + Class: LiquidError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: LiquidError

+ + + +
+
+

Hierarchy

+

Constructors

constructor

+ new LiquidError(err: Error, token: Token): LiquidError

+

Defined in util/error.ts:8

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: LiquidError

+

Properties

context

context: string

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Private originalError

originalError: Error

+

Defined in util/error.ts:8

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+
+

Private token

token: Token

+

Defined in util/error.ts:6

+
+

Static Error

Error: ErrorConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:984

+

Methods

Protected update

update(): void

+

Defined in util/error.ts:15

+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.parseerror.html b/zh-cn/api/classes/util_error_.parseerror.html new file mode 100644 index 000000000..ae32b9d92 --- /dev/null +++ b/zh-cn/api/classes/util_error_.parseerror.html @@ -0,0 +1,219 @@ + + + + + Class: ParseError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: ParseError

+ + + +
+
+

Hierarchy

LiquidError

+

ParseError

+

Constructors

constructor

+ new ParseError(err: Error, token: Token): ParseError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:32

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: ParseError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.rendererror.html b/zh-cn/api/classes/util_error_.rendererror.html new file mode 100644 index 000000000..f91a6e038 --- /dev/null +++ b/zh-cn/api/classes/util_error_.rendererror.html @@ -0,0 +1,236 @@ + + + + + Class: RenderError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: RenderError

+ + + +
+
+

Hierarchy

LiquidError

+

RenderError

+

Constructors

constructor

+ new RenderError(err: Error, tpl: Template): RenderError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tplTemplate
+

Returns: RenderError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+
+

Static is

is(obj: any): boolean

+

Defined in util/error.ts:48

+

Parameters:

+ + + + + + + + + + + +
NameType
objany
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.tokenizationerror.html b/zh-cn/api/classes/util_error_.tokenizationerror.html new file mode 100644 index 000000000..b8bf35758 --- /dev/null +++ b/zh-cn/api/classes/util_error_.tokenizationerror.html @@ -0,0 +1,219 @@ + + + + + Class: TokenizationError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TokenizationError

+ + + +
+
+

Hierarchy

LiquidError

+

TokenizationError

+

Constructors

constructor

+ new TokenizationError(message: string, token: Token): TokenizationError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:24

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
messagestring
tokenToken
+

Returns: TokenizationError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_error_.undefinedvariableerror.html b/zh-cn/api/classes/util_error_.undefinedvariableerror.html new file mode 100644 index 000000000..323ce5b73 --- /dev/null +++ b/zh-cn/api/classes/util_error_.undefinedvariableerror.html @@ -0,0 +1,219 @@ + + + + + Class: UndefinedVariableError | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: UndefinedVariableError

+ + + +
+
+

Hierarchy

LiquidError

+

UndefinedVariableError

+

Constructors

constructor

+ new UndefinedVariableError(err: Error, token: Token): UndefinedVariableError

+

Overrides LiquidError.constructor

+

Defined in util/error.ts:53

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError
tokenToken
+

Returns: UndefinedVariableError

+

Properties

context

context: string

+

Inherited from LiquidError.context

+

Defined in util/error.ts:7

+
+

message

message: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:974

+
+

name

name: string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:973

+
+

Optional stack

stack? : undefined | string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:975

+

Methods

Protected update

update(): void

+

Inherited from LiquidError.update

+

Defined in util/error.ts:15

+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/classes/util_strftime_.timezonedate.html b/zh-cn/api/classes/util_strftime_.timezonedate.html new file mode 100644 index 000000000..a4b4c52b4 --- /dev/null +++ b/zh-cn/api/classes/util_strftime_.timezonedate.html @@ -0,0 +1,829 @@ + + + + + Class: TimezoneDate | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Class: TimezoneDate

+ + + +
+
+

Hierarchy

    +
  • Date

    +

    TimezoneDate

    +
  • +
+

Constructors

constructor

+ new TimezoneDate(dateString: string): TimezoneDate

+

Defined in util/strftime.ts:180

+

Parameters:

+ + + + + + + + + + + +
NameType
dateStringstring
+

Returns: TimezoneDate

+

Properties

ISO8601_TIMEZONE_PATTERN

ISO8601_TIMEZONE_PATTERN: RegExp = /([zZ]|([+-])(\d{2}):(\d{2}))$/

+

Defined in util/strftime.ts:178

+
+

dateString

dateString: string

+

Defined in util/strftime.ts:182

+
+

inputTimezoneOffset

inputTimezoneOffset: number = 0

+

Defined in util/strftime.ts:180

+
+

Static Date

Date: DateConstructor

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:907

+

Methods

__@toPrimitive

__@toPrimitive(hint: “default”): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:109

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“default”
+

Returns: string

+

__@toPrimitive(hint: “string”): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:113

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“string”
+

Returns: string

+

__@toPrimitive(hint: “number”): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
hint“number”
+

Returns: number

+

__@toPrimitive(hint: string): string | number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts:126

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
hintstringThe strings “number”, “string”, or “default” to specify what primitive to return.
+

Returns: string | number

+

A number if ‘hint’ was “number”, a string if ‘hint’ was “string” or “default”.

+
+

getDate

getDate(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:755

+

Returns: number

+
+

getDay

getDay(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:759

+

Returns: number

+
+

getDisplayDate

getDisplayDate(): Date

+

Defined in util/strftime.ts:194

+

Returns: Date

+
+

getFullYear

getFullYear(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:747

+

Returns: number

+
+

getHours

getHours(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:763

+

Returns: number

+
+

getMilliseconds

getMilliseconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:775

+

Returns: number

+
+

getMinutes

getMinutes(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:767

+

Returns: number

+
+

getMonth

getMonth(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:751

+

Returns: number

+
+

getSeconds

getSeconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:771

+

Returns: number

+
+

getTime

getTime(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:745

+

Returns: number

+
+

getTimezoneOffset

getTimezoneOffset(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:779

+

Returns: number

+
+

getUTCDate

getUTCDate(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:757

+

Returns: number

+
+

getUTCDay

getUTCDay(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:761

+

Returns: number

+
+

getUTCFullYear

getUTCFullYear(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:749

+

Returns: number

+
+

getUTCHours

getUTCHours(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:765

+

Returns: number

+
+

getUTCMilliseconds

getUTCMilliseconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:777

+

Returns: number

+
+

getUTCMinutes

getUTCMinutes(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:769

+

Returns: number

+
+

getUTCMonth

getUTCMonth(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:753

+

Returns: number

+
+

getUTCSeconds

getUTCSeconds(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:773

+

Returns: number

+
+

setDate

setDate(date: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:842

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
datenumberA numeric value equal to the day of the month.
+

Returns: number

+
+

setFullYear

setFullYear(year: number, month?: undefined | number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:866

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
yearnumberA numeric value for the year.
month?undefined | numberA zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
date?undefined | numberA numeric value equal for the day of the month.
+

Returns: number

+
+

setHours

setHours(hours: number, min?: undefined | number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:829

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
hoursnumberA numeric value equal to the hours value.
min?undefined | numberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setMilliseconds

setMilliseconds(ms: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:789

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
msnumberA numeric value equal to the millisecond value.
+

Returns: number

+
+

setMinutes

setMinutes(min: number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:814

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minnumberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setMonth

setMonth(month: number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:853

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
monthnumberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
date?undefined | numberA numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
+

Returns: number

+
+

setSeconds

setSeconds(sec: number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:801

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
secnumberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setTime

setTime(time: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:784

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
timenumberA numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.
+

Returns: number

+
+

setUTCDate

setUTCDate(date: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:847

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
datenumberA numeric value equal to the day of the month.
+

Returns: number

+
+

setUTCFullYear

setUTCFullYear(year: number, month?: undefined | number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:873

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
yearnumberA numeric value equal to the year.
month?undefined | numberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
date?undefined | numberA numeric value equal to the day of the month.
+

Returns: number

+
+

setUTCHours

setUTCHours(hours: number, min?: undefined | number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:837

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
hoursnumberA numeric value equal to the hours value.
min?undefined | numberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setUTCMilliseconds

setUTCMilliseconds(ms: number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:794

+

Parameters:

+ + + + + + + + + + + + + +
NameTypeDescription
msnumberA numeric value equal to the millisecond value.
+

Returns: number

+
+

setUTCMinutes

setUTCMinutes(min: number, sec?: undefined | number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:821

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
minnumberA numeric value equal to the minutes value.
sec?undefined | numberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

setUTCMonth

setUTCMonth(month: number, date?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:859

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
monthnumberA numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
date?undefined | numberA numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
+

Returns: number

+
+

setUTCSeconds

setUTCSeconds(sec: number, ms?: undefined | number): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:807

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDescription
secnumberA numeric value equal to the seconds value.
ms?undefined | numberA numeric value equal to the milliseconds value.
+

Returns: number

+
+

toDateString

toDateString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:733

+

Returns: string

+
+

toISOString

toISOString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:877

+

Returns: string

+
+

toJSON

toJSON(key?: any): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:879

+

Parameters:

+ + + + + + + + + + + +
NameType
key?any
+

Returns: string

+
+

toLocaleDateString

toLocaleDateString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:739

+

Returns: string

+
+

toLocaleString

toLocaleString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:737

+

Returns: string

+
+

toLocaleTimeString

toLocaleTimeString(): string

+

Inherited from void

+

Overrides void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:741

+

Returns: string

+
+

toString

toString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:731

+

Returns: string

+
+

toTimeString

toTimeString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:735

+

Returns: string

+
+

toUTCString

toUTCString(): string

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:875

+

Returns: string

+
+

valueOf

valueOf(): number

+

Inherited from void

+

Defined in /home/travis/build/harttle/liquidjs/node_modules/typescript/lib/lib.es5.d.ts:743

+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/enums/context_block_mode_.blockmode.html b/zh-cn/api/enums/context_block_mode_.blockmode.html new file mode 100644 index 000000000..01d644d02 --- /dev/null +++ b/zh-cn/api/enums/context_block_mode_.blockmode.html @@ -0,0 +1,181 @@ + + + + + Enumeration: BlockMode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/enums/parser_token_kind_.tokenkind.html b/zh-cn/api/enums/parser_token_kind_.tokenkind.html new file mode 100644 index 000000000..a9b0d8409 --- /dev/null +++ b/zh-cn/api/enums/parser_token_kind_.tokenkind.html @@ -0,0 +1,214 @@ + + + + + Enumeration: TokenKind | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Enumeration: TokenKind

+ + + +
+
+

Enumeration members

Delimited

Delimited: = Tag | Output

+

Defined in parser/token-kind.ts:14

+
+

Filter

Filter: = 32

+

Defined in parser/token-kind.ts:7

+
+

HTML

HTML: = 16

+

Defined in parser/token-kind.ts:6

+
+

Hash

Hash: = 64

+

Defined in parser/token-kind.ts:8

+
+

Literal

Literal: = 2

+

Defined in parser/token-kind.ts:3

+
+

Number

Number: = 1

+

Defined in parser/token-kind.ts:2

+
+

Operator

Operator: = 2048

+

Defined in parser/token-kind.ts:13

+
+

Output

Output: = 8

+

Defined in parser/token-kind.ts:5

+
+

PropertyAccess

PropertyAccess: = 128

+

Defined in parser/token-kind.ts:9

+
+

Quoted

Quoted: = 1024

+

Defined in parser/token-kind.ts:12

+
+

Range

Range: = 512

+

Defined in parser/token-kind.ts:11

+
+

Tag

Tag: = 4

+

Defined in parser/token-kind.ts:4

+
+

Word

Word: = 256

+

Defined in parser/token-kind.ts:10

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/globals.html b/zh-cn/api/globals.html new file mode 100644 index 000000000..d98956dc7 --- /dev/null +++ b/zh-cn/api/globals.html @@ -0,0 +1,176 @@ + + + + + liquidjs | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/cache_cache_.cache.html b/zh-cn/api/interfaces/cache_cache_.cache.html new file mode 100644 index 000000000..4965ba932 --- /dev/null +++ b/zh-cn/api/interfaces/cache_cache_.cache.html @@ -0,0 +1,220 @@ + + + + + Interface: Cache <T> | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Cache <T>

+ + + +
+
+

Type parameters

T

+

Hierarchy

    +
  • Cache
  • +
+

Implemented by

+

Methods

read

read(key: string): T | undefined | Promise‹T | undefined›

+

Defined in cache/cache.ts:3

+

Parameters:

+ + + + + + + + + + + +
NameType
keystring
+

Returns: T | undefined | Promise‹T | undefined›

+
+

write

write(key: string, value: T): void | Promise‹void›

+

Defined in cache/cache.ts:2

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
keystring
valueT
+

Returns: void | Promise‹void›

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/context_scope_.plainobject.html b/zh-cn/api/interfaces/context_scope_.plainobject.html new file mode 100644 index 000000000..78b3632df --- /dev/null +++ b/zh-cn/api/interfaces/context_scope_.plainobject.html @@ -0,0 +1,184 @@ + + + + + Interface: PlainObject | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/drop_comparable_.comparable.html b/zh-cn/api/interfaces/drop_comparable_.comparable.html new file mode 100644 index 000000000..b61c74e9b --- /dev/null +++ b/zh-cn/api/interfaces/drop_comparable_.comparable.html @@ -0,0 +1,268 @@ + + + + + Interface: Comparable | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Comparable

+ + + +
+
+

Hierarchy

    +
  • Comparable
  • +
+

Implemented by

+

Properties

equals

equals: function

+

Defined in drop/comparable.ts:4

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

geq

geq: function

+

Defined in drop/comparable.ts:6

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

gt

gt: function

+

Defined in drop/comparable.ts:5

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

leq

leq: function

+

Defined in drop/comparable.ts:8

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+
+

lt

lt: function

+

Defined in drop/comparable.ts:7

+

Type declaration:

▸ (rhs: any): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
rhsany
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/fs_fs_.fs.html b/zh-cn/api/interfaces/fs_fs_.fs.html new file mode 100644 index 000000000..0547d3f71 --- /dev/null +++ b/zh-cn/api/interfaces/fs_fs_.fs.html @@ -0,0 +1,274 @@ + + + + + Interface: FS | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: FS

+ + + +
+
+

Hierarchy

    +
  • FS
  • +
+

Properties

exists

exists: function

+

Defined in fs/fs.ts:2

+

Type declaration:

▸ (filepath: string): Promise‹boolean›

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

existsSync

existsSync: function

+

Defined in fs/fs.ts:4

+

Type declaration:

▸ (filepath: string): boolean

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

Optional fallback

fallback? : undefined | function

+

Defined in fs/fs.ts:7

+
+

readFile

readFile: function

+

Defined in fs/fs.ts:3

+

Type declaration:

▸ (filepath: string): Promise‹string›

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

readFileSync

readFileSync: function

+

Defined in fs/fs.ts:5

+

Type declaration:

▸ (filepath: string): string

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+
+

resolve

resolve: function

+

Defined in fs/fs.ts:6

+

Type declaration:

▸ (root: string, file: string, ext: string): string

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filestring
extstring
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/liquid_options_.liquidoptions.html b/zh-cn/api/interfaces/liquid_options_.liquidoptions.html new file mode 100644 index 000000000..0d398fcff --- /dev/null +++ b/zh-cn/api/interfaces/liquid_options_.liquidoptions.html @@ -0,0 +1,246 @@ + + + + + Interface: LiquidOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: LiquidOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional cache

cache? : boolean | number | CacheTemplate[]›

+

Defined in liquid-options.ts:16

+
+

Optional dynamicPartials

dynamicPartials? : undefined | false | true

+

Defined in liquid-options.ts:20

+
+

Optional extname

extname? : undefined | string

+

Defined in liquid-options.ts:14

+
+

Optional fs

fs? : FS

+

Defined in liquid-options.ts:48

+
+

Optional globals

globals? : undefined | object

+

Defined in liquid-options.ts:50

+
+

Optional greedy

greedy? : undefined | false | true

+

Defined in liquid-options.ts:46

+
+

Optional jsTruthy

jsTruthy? : undefined | false | true

+

Defined in liquid-options.ts:18

+
+

Optional keepOutputType

keepOutputType? : undefined | false | true

+

Defined in liquid-options.ts:52

+
+

Optional lenientIf

lenientIf? : undefined | false | true

+

Defined in liquid-options.ts:26

+
+

Optional operators

operators? : Operators

+

Defined in liquid-options.ts:54

+
+

Optional outputDelimiterLeft

outputDelimiterLeft? : undefined | string

+

Defined in liquid-options.ts:40

+
+

Optional outputDelimiterRight

outputDelimiterRight? : undefined | string

+

Defined in liquid-options.ts:42

+
+

Optional preserveTimezones

preserveTimezones? : undefined | false | true

+

Defined in liquid-options.ts:44

+
+

Optional root

root? : string | string[]

+

Defined in liquid-options.ts:12

+
+

Optional strictFilters

strictFilters? : undefined | false | true

+

Defined in liquid-options.ts:22

+
+

Optional strictVariables

strictVariables? : undefined | false | true

+

Defined in liquid-options.ts:24

+
+

Optional tagDelimiterLeft

tagDelimiterLeft? : undefined | string

+

Defined in liquid-options.ts:36

+
+

Optional tagDelimiterRight

tagDelimiterRight? : undefined | string

+

Defined in liquid-options.ts:38

+
+

Optional trimOutputLeft

trimOutputLeft? : undefined | false | true

+

Defined in liquid-options.ts:34

+
+

Optional trimOutputRight

trimOutputRight? : undefined | false | true

+

Defined in liquid-options.ts:32

+
+

Optional trimTagLeft

trimTagLeft? : undefined | false | true

+

Defined in liquid-options.ts:30

+
+

Optional trimTagRight

trimTagRight? : undefined | false | true

+

Defined in liquid-options.ts:28

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/liquid_options_.normalizedfulloptions.html b/zh-cn/api/interfaces/liquid_options_.normalizedfulloptions.html new file mode 100644 index 000000000..29b9ad7c0 --- /dev/null +++ b/zh-cn/api/interfaces/liquid_options_.normalizedfulloptions.html @@ -0,0 +1,269 @@ + + + + + Interface: NormalizedFullOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: NormalizedFullOptions

+ + + +
+
+

Hierarchy

NormalizedOptions

+

NormalizedFullOptions

+

Properties

cache

cache: undefined | CacheTemplate[]›

+

Overrides NormalizedOptions.cache

+

Defined in liquid-options.ts:66

+
+

dynamicPartials

dynamicPartials: boolean

+

Overrides LiquidOptions.dynamicPartials

+

Defined in liquid-options.ts:68

+
+

extname

extname: string

+

Overrides LiquidOptions.extname

+

Defined in liquid-options.ts:65

+
+

fs

fs: FS

+

Overrides LiquidOptions.fs

+

Defined in liquid-options.ts:69

+
+

globals

globals: object

+

Overrides LiquidOptions.globals

+

Defined in liquid-options.ts:83

+
+

greedy

greedy: boolean

+

Overrides LiquidOptions.greedy

+

Defined in liquid-options.ts:82

+
+

jsTruthy

jsTruthy: boolean

+

Overrides LiquidOptions.jsTruthy

+

Defined in liquid-options.ts:67

+
+

keepOutputType

keepOutputType: boolean

+

Overrides LiquidOptions.keepOutputType

+

Defined in liquid-options.ts:84

+
+

lenientIf

lenientIf: boolean

+

Overrides LiquidOptions.lenientIf

+

Defined in liquid-options.ts:72

+
+

operators

operators: Operators

+

Overrides LiquidOptions.operators

+

Defined in liquid-options.ts:85

+
+

operatorsTrie

operatorsTrie: Trie

+

Overrides NormalizedOptions.operatorsTrie

+

Defined in liquid-options.ts:86

+
+

outputDelimiterLeft

outputDelimiterLeft: string

+

Overrides LiquidOptions.outputDelimiterLeft

+

Defined in liquid-options.ts:79

+
+

outputDelimiterRight

outputDelimiterRight: string

+

Overrides LiquidOptions.outputDelimiterRight

+

Defined in liquid-options.ts:80

+
+

preserveTimezones

preserveTimezones: boolean

+

Overrides LiquidOptions.preserveTimezones

+

Defined in liquid-options.ts:81

+
+

root

root: string[]

+

Overrides NormalizedOptions.root

+

Defined in liquid-options.ts:64

+
+

strictFilters

strictFilters: boolean

+

Overrides LiquidOptions.strictFilters

+

Defined in liquid-options.ts:70

+
+

strictVariables

strictVariables: boolean

+

Overrides LiquidOptions.strictVariables

+

Defined in liquid-options.ts:71

+
+

tagDelimiterLeft

tagDelimiterLeft: string

+

Overrides LiquidOptions.tagDelimiterLeft

+

Defined in liquid-options.ts:77

+
+

tagDelimiterRight

tagDelimiterRight: string

+

Overrides LiquidOptions.tagDelimiterRight

+

Defined in liquid-options.ts:78

+
+

trimOutputLeft

trimOutputLeft: boolean

+

Overrides LiquidOptions.trimOutputLeft

+

Defined in liquid-options.ts:76

+
+

trimOutputRight

trimOutputRight: boolean

+

Overrides LiquidOptions.trimOutputRight

+

Defined in liquid-options.ts:75

+
+

trimTagLeft

trimTagLeft: boolean

+

Overrides LiquidOptions.trimTagLeft

+

Defined in liquid-options.ts:74

+
+

trimTagRight

trimTagRight: boolean

+

Overrides LiquidOptions.trimTagRight

+

Defined in liquid-options.ts:73

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/liquid_options_.normalizedoptions.html b/zh-cn/api/interfaces/liquid_options_.normalizedoptions.html new file mode 100644 index 000000000..4a73b43c6 --- /dev/null +++ b/zh-cn/api/interfaces/liquid_options_.normalizedoptions.html @@ -0,0 +1,272 @@ + + + + + Interface: NormalizedOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: NormalizedOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional cache

cache? : CacheTemplate[]›

+

Overrides LiquidOptions.cache

+

Defined in liquid-options.ts:59

+
+

Optional dynamicPartials

dynamicPartials? : undefined | false | true

+

Inherited from LiquidOptions.dynamicPartials

+

Defined in liquid-options.ts:20

+
+

Optional extname

extname? : undefined | string

+

Inherited from LiquidOptions.extname

+

Defined in liquid-options.ts:14

+
+

Optional fs

fs? : FS

+

Inherited from LiquidOptions.fs

+

Defined in liquid-options.ts:48

+
+

Optional globals

globals? : undefined | object

+

Inherited from LiquidOptions.globals

+

Defined in liquid-options.ts:50

+
+

Optional greedy

greedy? : undefined | false | true

+

Inherited from LiquidOptions.greedy

+

Defined in liquid-options.ts:46

+
+

Optional jsTruthy

jsTruthy? : undefined | false | true

+

Inherited from LiquidOptions.jsTruthy

+

Defined in liquid-options.ts:18

+
+

Optional keepOutputType

keepOutputType? : undefined | false | true

+

Inherited from LiquidOptions.keepOutputType

+

Defined in liquid-options.ts:52

+
+

Optional lenientIf

lenientIf? : undefined | false | true

+

Inherited from LiquidOptions.lenientIf

+

Defined in liquid-options.ts:26

+
+

Optional operators

operators? : Operators

+

Inherited from LiquidOptions.operators

+

Defined in liquid-options.ts:54

+
+

Optional operatorsTrie

operatorsTrie? : Trie

+

Defined in liquid-options.ts:60

+
+

Optional outputDelimiterLeft

outputDelimiterLeft? : undefined | string

+

Inherited from LiquidOptions.outputDelimiterLeft

+

Defined in liquid-options.ts:40

+
+

Optional outputDelimiterRight

outputDelimiterRight? : undefined | string

+

Inherited from LiquidOptions.outputDelimiterRight

+

Defined in liquid-options.ts:42

+
+

Optional preserveTimezones

preserveTimezones? : undefined | false | true

+

Inherited from LiquidOptions.preserveTimezones

+

Defined in liquid-options.ts:44

+
+

Optional root

root? : string[]

+

Overrides LiquidOptions.root

+

Defined in liquid-options.ts:58

+
+

Optional strictFilters

strictFilters? : undefined | false | true

+

Inherited from LiquidOptions.strictFilters

+

Defined in liquid-options.ts:22

+
+

Optional strictVariables

strictVariables? : undefined | false | true

+

Inherited from LiquidOptions.strictVariables

+

Defined in liquid-options.ts:24

+
+

Optional tagDelimiterLeft

tagDelimiterLeft? : undefined | string

+

Inherited from LiquidOptions.tagDelimiterLeft

+

Defined in liquid-options.ts:36

+
+

Optional tagDelimiterRight

tagDelimiterRight? : undefined | string

+

Inherited from LiquidOptions.tagDelimiterRight

+

Defined in liquid-options.ts:38

+
+

Optional trimOutputLeft

trimOutputLeft? : undefined | false | true

+

Inherited from LiquidOptions.trimOutputLeft

+

Defined in liquid-options.ts:34

+
+

Optional trimOutputRight

trimOutputRight? : undefined | false | true

+

Inherited from LiquidOptions.trimOutputRight

+

Defined in liquid-options.ts:32

+
+

Optional trimTagLeft

trimTagLeft? : undefined | false | true

+

Inherited from LiquidOptions.trimTagLeft

+

Defined in liquid-options.ts:30

+
+

Optional trimTagRight

trimTagRight? : undefined | false | true

+

Inherited from LiquidOptions.trimTagRight

+

Defined in liquid-options.ts:28

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/render_operator_.operators.html b/zh-cn/api/interfaces/render_operator_.operators.html new file mode 100644 index 000000000..6049f17b2 --- /dev/null +++ b/zh-cn/api/interfaces/render_operator_.operators.html @@ -0,0 +1,204 @@ + + + + + Interface: Operators | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Operators

+ + + +
+
+

Hierarchy

    +
  • Operators
  • +
+

Indexable

    +
  • [ key: string]: function
  • +
+

▸ (lhs: any, rhs: any, ctx: Context): boolean

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lhsany
rhsany
ctxContext
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/template_filter_filter_impl_.filterimpl.html b/zh-cn/api/interfaces/template_filter_filter_impl_.filterimpl.html new file mode 100644 index 000000000..7f798b62c --- /dev/null +++ b/zh-cn/api/interfaces/template_filter_filter_impl_.filterimpl.html @@ -0,0 +1,184 @@ + + + + + Interface: FilterImpl | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html b/zh-cn/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html new file mode 100644 index 000000000..93c02466c --- /dev/null +++ b/zh-cn/api/interfaces/template_filter_filter_impl_options_.filterimploptions.html @@ -0,0 +1,203 @@ + + + + + Interface: FilterImplOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/template_tag_tag_impl_.tagimpl.html b/zh-cn/api/interfaces/template_tag_tag_impl_.tagimpl.html new file mode 100644 index 000000000..c5d055078 --- /dev/null +++ b/zh-cn/api/interfaces/template_tag_tag_impl_.tagimpl.html @@ -0,0 +1,220 @@ + + + + + Interface: TagImpl | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: TagImpl

+ + + +
+
+

Hierarchy

+

Indexable

    +
  • [ key: string]: any
  • +
+

Properties

liquid

liquid: Liquid

+

Defined in template/tag/tag-impl.ts:5

+
+

Optional parse

parse? : undefined | function

+

Inherited from TagImplOptions.parse

+

Defined in template/tag/tag-impl-options.ts:9

+
+

render

render: function

+

Inherited from TagImplOptions.render

+

Defined in template/tag/tag-impl-options.ts:10

+

Type declaration:

▸ (this: TagImpl, ctx: Context, emitter: Emitter, hash: Hash): any

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisTagImpl
ctxContext
emitterEmitter
hashHash
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html b/zh-cn/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html new file mode 100644 index 000000000..37b06e3d9 --- /dev/null +++ b/zh-cn/api/interfaces/template_tag_tag_impl_options_.tagimploptions.html @@ -0,0 +1,212 @@ + + + + + Interface: TagImplOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: TagImplOptions

+ + + +
+
+

Hierarchy

+

Properties

Optional parse

parse? : undefined | function

+

Defined in template/tag/tag-impl-options.ts:9

+
+

render

render: function

+

Defined in template/tag/tag-impl-options.ts:10

+

Type declaration:

▸ (this: TagImpl, ctx: Context, emitter: Emitter, hash: Hash): any

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisTagImpl
ctxContext
emitterEmitter
hashHash
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/template_template_.template.html b/zh-cn/api/interfaces/template_template_.template.html new file mode 100644 index 000000000..58a51d627 --- /dev/null +++ b/zh-cn/api/interfaces/template_template_.template.html @@ -0,0 +1,206 @@ + + + + + Interface: Template | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/util_async_.thenable.html b/zh-cn/api/interfaces/util_async_.thenable.html new file mode 100644 index 000000000..d5d9828c7 --- /dev/null +++ b/zh-cn/api/interfaces/util_async_.thenable.html @@ -0,0 +1,216 @@ + + + + + Interface: Thenable | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Interface: Thenable

+ + + +
+
+

Hierarchy

    +
  • Thenable
  • +
+

Methods

catch

catch(reject: resolver): Thenable

+

Defined in util/async.ts:7

+

Parameters:

+ + + + + + + + + + + +
NameType
rejectresolver
+

Returns: Thenable

+
+

then

then(resolve: resolver, reject?: resolver): Thenable

+

Defined in util/async.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
resolveresolver
reject?resolver
+

Returns: Thenable

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/util_operator_trie_.trie.html b/zh-cn/api/interfaces/util_operator_trie_.trie.html new file mode 100644 index 000000000..2e7596c7d --- /dev/null +++ b/zh-cn/api/interfaces/util_operator_trie_.trie.html @@ -0,0 +1,182 @@ + + + + + Interface: Trie | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/interfaces/util_strftime_.formatoptions.html b/zh-cn/api/interfaces/util_strftime_.formatoptions.html new file mode 100644 index 000000000..acf6ebff9 --- /dev/null +++ b/zh-cn/api/interfaces/util_strftime_.formatoptions.html @@ -0,0 +1,187 @@ + + + + + Interface: FormatOptions | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_array_.html b/zh-cn/api/modules/builtin_filters_array_.html new file mode 100644 index 000000000..a5a627674 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_array_.html @@ -0,0 +1,447 @@ + + + + + External module: "builtin/filters/array" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/array"

+ + + +
+
+

Functions

compact

compact<T>(this: FilterImpl, arr: T[]): any[]

+

Defined in builtin/filters/array.ts:27

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
+

Returns: any[]

+
+

concat

concat<T1, T2>(v: T1[], arg: T2[] | T2): T1 | T2[]

+

Defined in builtin/filters/array.ts:31

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vT1[]
argT2[] | T2
+

Returns: T1 | T2[]

+
+

Const first

first(v: any): any

+

Defined in builtin/filters/array.ts:9

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: any

+
+

Const join

join(v: any[], arg: string): string

+

Defined in builtin/filters/array.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vany[]
argstring
+

Returns: string

+
+

Const last

last(v: any): any

+

Defined in builtin/filters/array.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: any

+
+

map

map<T1, T2>(this: FilterImpl, arr: Scope[], property: string): object[]

+

Defined in builtin/filters/array.ts:23

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrScope[]
propertystring
+

Returns: object[]

+
+

Const reverse

reverse(v: any[]): any[]

+

Defined in builtin/filters/array.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
vany[]
+

Returns: any[]

+
+

Const size

size(v: string | any[]): number

+

Defined in builtin/filters/array.ts:21

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring | any[]
+

Returns: number

+
+

slice

slice<T>(v: T[], begin: number, length: number): T[]

+

Defined in builtin/filters/array.ts:35

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vT[]-
beginnumber-
lengthnumber1
+

Returns: T[]

+
+

sort

sort<T>(this: FilterImpl, arr: T[], property?: undefined | string): any[]

+

Defined in builtin/filters/array.ts:12

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
property?undefined | string
+

Returns: any[]

+
+

uniq

uniq<T>(arr: T[]): T[]

+

Defined in builtin/filters/array.ts:47

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
arrT[]
+

Returns: T[]

+
+

where

where<T>(this: FilterImpl, arr: T[], property: string, expected?: any): T[]

+

Defined in builtin/filters/array.ts:40

+

Type parameters:

+

T: object

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
arrT[]
propertystring
expected?any
+

Returns: T[]

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_date_.html b/zh-cn/api/modules/builtin_filters_date_.html new file mode 100644 index 000000000..d00fd59c3 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_date_.html @@ -0,0 +1,217 @@ + + + + + External module: "builtin/filters/date" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/date"

+ + + +
+
+

Functions

date

date(this: FilterImpl, v: string | Date, arg: string): string | Date

+

Defined in builtin/filters/date.ts:5

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
vstring | Date
argstring
+

Returns: string | Date

+
+

isValidDate

isValidDate(date: any): boolean

+

Defined in builtin/filters/date.ts:23

+

Parameters:

+ + + + + + + + + + + +
NameType
dateany
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_html_.html b/zh-cn/api/modules/builtin_filters_html_.html new file mode 100644 index 000000000..a1ce736e1 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_html_.html @@ -0,0 +1,283 @@ + + + + + External module: "builtin/filters/html" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/html"

+ + + +
+
+

Functions

escape

escape(str: string): string

+

Defined in builtin/filters/html.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

escapeOnce

escapeOnce(str: string): string

+

Defined in builtin/filters/html.ts:26

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

newlineToBr

newlineToBr(v: string): string

+

Defined in builtin/filters/html.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

stripHtml

stripHtml(v: string): string

+

Defined in builtin/filters/html.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

unescape

unescape(str: string): string

+

Defined in builtin/filters/html.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+

Object literals

Const escapeMap

escapeMap: object

Defined in builtin/filters/html.ts:3

+

: string = “"”

+

Defined in builtin/filters/html.ts:7

+

&

&: string = “&”

+

Defined in builtin/filters/html.ts:4

+

: string = “'”

+

Defined in builtin/filters/html.ts:8

+

<

<: string = “<”

+

Defined in builtin/filters/html.ts:5

+

>

>: string = “>”

+

Defined in builtin/filters/html.ts:6

+
+

Const unescapeMap

unescapeMap: object

Defined in builtin/filters/html.ts:10

+

"

": string = “””

+

Defined in builtin/filters/html.ts:14

+

'

': string = “‘“

+

Defined in builtin/filters/html.ts:15

+

&

&: string = “&”

+

Defined in builtin/filters/html.ts:11

+

>

>: string = “>”

+

Defined in builtin/filters/html.ts:13

+

<

<: string = “<”

+

Defined in builtin/filters/html.ts:12

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_index_.html b/zh-cn/api/modules/builtin_filters_index_.html new file mode 100644 index 000000000..bcebf2132 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_index_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/filters/index" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_math_.html b/zh-cn/api/modules/builtin_filters_math_.html new file mode 100644 index 000000000..21f7e23c3 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_math_.html @@ -0,0 +1,339 @@ + + + + + External module: "builtin/filters/math" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/math"

+ + + +
+
+

Variables

Const abs

abs: abs = Math.abs

+

Defined in builtin/filters/math.ts:3

+
+

Const atLeast

atLeast: max = Math.max

+

Defined in builtin/filters/math.ts:4

+
+

Const atMost

atMost: min = Math.min

+

Defined in builtin/filters/math.ts:5

+
+

Const ceil

ceil: ceil = Math.ceil

+

Defined in builtin/filters/math.ts:6

+
+

Const floor

floor: floor = Math.floor

+

Defined in builtin/filters/math.ts:8

+

Functions

Const dividedBy

dividedBy(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

Const minus

minus(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

Const modulo

modulo(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:10

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

plus

plus(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:18

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+
+

round

round(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:13

+

Parameters:

+ + + + + + + + + + + + + + + + + + +
NameTypeDefault
vnumber-
argnumber0
+

Returns: number

+
+

sortNatural

sortNatural(input: any[], property?: undefined | string): any[]

+

Defined in builtin/filters/math.ts:22

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
inputany[]
property?undefined | string
+

Returns: any[]

+
+

Const times

times(v: number, arg: number): number

+

Defined in builtin/filters/math.ts:11

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vnumber
argnumber
+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_object_.html b/zh-cn/api/modules/builtin_filters_object_.html new file mode 100644 index 000000000..90d134459 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_object_.html @@ -0,0 +1,220 @@ + + + + + External module: "builtin/filters/object" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/object"

+ + + +
+
+

Functions

Default

Default<T1, T2>(this: FilterImpl, v: string | T1, arg: T2): string | T1 | T2

+

Defined in builtin/filters/object.ts:5

+

Type parameters:

+

T1

+

T2

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
thisFilterImpl
vstring | T1
argT2
+

Returns: string | T1 | T2

+
+

json

json(v: any): string

+

Defined in builtin/filters/object.ts:9

+

Parameters:

+ + + + + + + + + + + +
NameType
vany
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_string_.html b/zh-cn/api/modules/builtin_filters_string_.html new file mode 100644 index 000000000..273ec6f47 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_string_.html @@ -0,0 +1,507 @@ + + + + + External module: "builtin/filters/string" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/string"

+ + + +
+
+

Functions

append

append(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:9

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

capitalize

capitalize(str: string): string

+

Defined in builtin/filters/string.ts:55

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

downcase

downcase(v: string): string

+

Defined in builtin/filters/string.ts:23

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

lstrip

lstrip(v: string): string

+

Defined in builtin/filters/string.ts:19

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

prepend

prepend(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:14

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

remove

remove(v: string, arg: string): string

+

Defined in builtin/filters/string.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string

+
+

removeFirst

removeFirst(v: string, l: string): string

+

Defined in builtin/filters/string.ts:35

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
lstring
+

Returns: string

+
+

replace

replace(v: string, pattern: string, replacement: string): string

+

Defined in builtin/filters/string.ts:60

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
vstring
patternstring
replacementstring
+

Returns: string

+
+

replaceFirst

replaceFirst(v: string, arg1: string, arg2: string): string

+

Defined in builtin/filters/string.ts:64

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
vstring
arg1string
arg2string
+

Returns: string

+
+

rstrip

rstrip(str: string): string

+

Defined in builtin/filters/string.ts:39

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

split

split(v: string, arg: string): string[]

+

Defined in builtin/filters/string.ts:43

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
vstring
argstring
+

Returns: string[]

+
+

strip

strip(v: string): string

+

Defined in builtin/filters/string.ts:47

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

stripNewlines

stripNewlines(v: string): string

+

Defined in builtin/filters/string.ts:51

+

Parameters:

+ + + + + + + + + + + +
NameType
vstring
+

Returns: string

+
+

truncate

truncate(v: string, l: number, o: string): string

+

Defined in builtin/filters/string.ts:68

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vstring-
lnumber50
ostring“…”
+

Returns: string

+
+

truncatewords

truncatewords(v: string, l: number, o: string): string

+

Defined in builtin/filters/string.ts:74

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
vstring-
lnumber15
ostring“…”
+

Returns: string

+
+

upcase

upcase(str: string): string

+

Defined in builtin/filters/string.ts:27

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_filters_url_.html b/zh-cn/api/modules/builtin_filters_url_.html new file mode 100644 index 000000000..c931642b1 --- /dev/null +++ b/zh-cn/api/modules/builtin_filters_url_.html @@ -0,0 +1,209 @@ + + + + + External module: "builtin/filters/url" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/filters/url"

+ + + +
+
+

Functions

Const urlDecode

urlDecode(x: string): string

+

Defined in builtin/filters/url.ts:1

+

Parameters:

+ + + + + + + + + + + +
NameType
xstring
+

Returns: string

+
+

Const urlEncode

urlEncode(x: string): string

+

Defined in builtin/filters/url.ts:2

+

Parameters:

+ + + + + + + + + + + +
NameType
xstring
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_assign_.html b/zh-cn/api/modules/builtin_tags_assign_.html new file mode 100644 index 000000000..b6555d3fa --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_assign_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/assign" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_block_.html b/zh-cn/api/modules/builtin_tags_block_.html new file mode 100644 index 000000000..336c6f1f9 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_block_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/block" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_break_.html b/zh-cn/api/modules/builtin_tags_break_.html new file mode 100644 index 000000000..363ceddbf --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_break_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/break" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_capture_.html b/zh-cn/api/modules/builtin_tags_capture_.html new file mode 100644 index 000000000..4bfee65c6 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_capture_.html @@ -0,0 +1,192 @@ + + + + + External module: "builtin/tags/capture" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_case_.html b/zh-cn/api/modules/builtin_tags_case_.html new file mode 100644 index 000000000..b0a981520 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_case_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/case" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_comment_.html b/zh-cn/api/modules/builtin_tags_comment_.html new file mode 100644 index 000000000..cf35e5f29 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_comment_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/comment" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_continue_.html b/zh-cn/api/modules/builtin_tags_continue_.html new file mode 100644 index 000000000..388221b3c --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_continue_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/continue" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_cycle_.html b/zh-cn/api/modules/builtin_tags_cycle_.html new file mode 100644 index 000000000..d99e09320 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_cycle_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/cycle" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_decrement_.html b/zh-cn/api/modules/builtin_tags_decrement_.html new file mode 100644 index 000000000..cce9cc0cc --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_decrement_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/decrement" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_for_.html b/zh-cn/api/modules/builtin_tags_for_.html new file mode 100644 index 000000000..388a1adae --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_for_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/for" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_if_.html b/zh-cn/api/modules/builtin_tags_if_.html new file mode 100644 index 000000000..7af5f053a --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_if_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/if" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_include_.html b/zh-cn/api/modules/builtin_tags_include_.html new file mode 100644 index 000000000..f21919762 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_include_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/include" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_increment_.html b/zh-cn/api/modules/builtin_tags_increment_.html new file mode 100644 index 000000000..5bd555fad --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_increment_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/increment" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_index_.html b/zh-cn/api/modules/builtin_tags_index_.html new file mode 100644 index 000000000..f96557231 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_index_.html @@ -0,0 +1,229 @@ + + + + + External module: "builtin/tags/index" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "builtin/tags/index"

+ + + +
+
+

Object literals

Const tags

tags: object

Defined in builtin/tags/index.ts:21

+

assign

assign: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

block

block: object

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

break

break: object = Break

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

capture

capture: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

case

case: TagImplOptions = Case

+

Defined in builtin/tags/index.ts:22

+

comment

comment: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

continue

continue: object = Continue

+

Defined in builtin/tags/index.ts:22

+

Type declaration:

+

cycle

cycle: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

decrement

decrement: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

for

for: TagImplOptions = For

+

Defined in builtin/tags/index.ts:22

+

if

if: TagImplOptions = If

+

Defined in builtin/tags/index.ts:22

+

include

include: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

increment

increment: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

layout

layout: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

raw

raw: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

render

render: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

tablerow

tablerow: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+

unless

unless: TagImplOptions

+

Defined in builtin/tags/index.ts:22

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_layout_.html b/zh-cn/api/modules/builtin_tags_layout_.html new file mode 100644 index 000000000..79fdb436c --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_layout_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/layout" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_raw_.html b/zh-cn/api/modules/builtin_tags_raw_.html new file mode 100644 index 000000000..24a5b781c --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_raw_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/raw" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_render_.html b/zh-cn/api/modules/builtin_tags_render_.html new file mode 100644 index 000000000..3780dadbf --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_render_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/render" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_tablerow_.html b/zh-cn/api/modules/builtin_tags_tablerow_.html new file mode 100644 index 000000000..cf002f0ca --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_tablerow_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/tablerow" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/builtin_tags_unless_.html b/zh-cn/api/modules/builtin_tags_unless_.html new file mode 100644 index 000000000..c801bf766 --- /dev/null +++ b/zh-cn/api/modules/builtin_tags_unless_.html @@ -0,0 +1,176 @@ + + + + + External module: "builtin/tags/unless" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/cache_cache_.html b/zh-cn/api/modules/cache_cache_.html new file mode 100644 index 000000000..d4a6249cd --- /dev/null +++ b/zh-cn/api/modules/cache_cache_.html @@ -0,0 +1,176 @@ + + + + + External module: "cache/cache" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/cache_lru_.html b/zh-cn/api/modules/cache_lru_.html new file mode 100644 index 000000000..d1e4158fc --- /dev/null +++ b/zh-cn/api/modules/cache_lru_.html @@ -0,0 +1,176 @@ + + + + + External module: "cache/lru" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/context_block_mode_.html b/zh-cn/api/modules/context_block_mode_.html new file mode 100644 index 000000000..0c11d8160 --- /dev/null +++ b/zh-cn/api/modules/context_block_mode_.html @@ -0,0 +1,176 @@ + + + + + External module: "context/block-mode" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/context_context_.html b/zh-cn/api/modules/context_context_.html new file mode 100644 index 000000000..183853483 --- /dev/null +++ b/zh-cn/api/modules/context_context_.html @@ -0,0 +1,247 @@ + + + + + External module: "context/context" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "context/context"

+ + + +
+
+

Functions

readFirst

readFirst(obj: Scope): any

+

Defined in context/context.ts:84

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+
+

readLast

readLast(obj: Scope): any

+

Defined in context/context.ts:89

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+
+

readProperty

readProperty(obj: Scope, key: string): any

+

Defined in context/context.ts:70

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
objScope
keystring
+

Returns: any

+
+

readSize

readSize(obj: Scope): any

+

Defined in context/context.ts:94

+

Parameters:

+ + + + + + + + + + + +
NameType
objScope
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/context_scope_.html b/zh-cn/api/modules/context_scope_.html new file mode 100644 index 000000000..15aced472 --- /dev/null +++ b/zh-cn/api/modules/context_scope_.html @@ -0,0 +1,178 @@ + + + + + External module: "context/scope" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_blank_drop_.html b/zh-cn/api/modules/drop_blank_drop_.html new file mode 100644 index 000000000..e7977ce64 --- /dev/null +++ b/zh-cn/api/modules/drop_blank_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/blank-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_block_drop_.html b/zh-cn/api/modules/drop_block_drop_.html new file mode 100644 index 000000000..bcf304fd8 --- /dev/null +++ b/zh-cn/api/modules/drop_block_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/block-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_comparable_.html b/zh-cn/api/modules/drop_comparable_.html new file mode 100644 index 000000000..908d26cc3 --- /dev/null +++ b/zh-cn/api/modules/drop_comparable_.html @@ -0,0 +1,192 @@ + + + + + External module: "drop/comparable" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_drop_.html b/zh-cn/api/modules/drop_drop_.html new file mode 100644 index 000000000..5de9a6140 --- /dev/null +++ b/zh-cn/api/modules/drop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_empty_drop_.html b/zh-cn/api/modules/drop_empty_drop_.html new file mode 100644 index 000000000..1fe3551d5 --- /dev/null +++ b/zh-cn/api/modules/drop_empty_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/empty-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_forloop_drop_.html b/zh-cn/api/modules/drop_forloop_drop_.html new file mode 100644 index 000000000..bccab5971 --- /dev/null +++ b/zh-cn/api/modules/drop_forloop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/forloop-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_null_drop_.html b/zh-cn/api/modules/drop_null_drop_.html new file mode 100644 index 000000000..beda74b99 --- /dev/null +++ b/zh-cn/api/modules/drop_null_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/null-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/drop_tablerowloop_drop_.html b/zh-cn/api/modules/drop_tablerowloop_drop_.html new file mode 100644 index 000000000..e07d81e73 --- /dev/null +++ b/zh-cn/api/modules/drop_tablerowloop_drop_.html @@ -0,0 +1,176 @@ + + + + + External module: "drop/tablerowloop-drop" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/fs_browser_.html b/zh-cn/api/modules/fs_browser_.html new file mode 100644 index 000000000..e898cb7db --- /dev/null +++ b/zh-cn/api/modules/fs_browser_.html @@ -0,0 +1,289 @@ + + + + + External module: "fs/browser" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "fs/browser"

+ + + +
+
+

Functions

domResolve

domResolve(root: string, path: string): string

+

Defined in fs/browser.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
rootstring
pathstring
+

Returns: string

+
+

exists

exists(filepath: string): Promise‹boolean›

+

Defined in fs/browser.ts:56

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹boolean›

+
+

existsSync

existsSync(filepath: string): boolean

+

Defined in fs/browser.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: boolean

+
+

readFile

readFile(url: string): Promise‹string›

+

Defined in fs/browser.ts:28

+

Parameters:

+ + + + + + + + + + + +
NameType
urlstring
+

Returns: Promise‹string›

+
+

readFileSync

readFileSync(url: string): string

+

Defined in fs/browser.ts:46

+

Parameters:

+ + + + + + + + + + + +
NameType
urlstring
+

Returns: string

+
+

resolve

resolve(root: string, filepath: string, ext: string): string

+

Defined in fs/browser.ts:18

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filepathstring
extstring
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/fs_fs_.html b/zh-cn/api/modules/fs_fs_.html new file mode 100644 index 000000000..4bb90addc --- /dev/null +++ b/zh-cn/api/modules/fs_fs_.html @@ -0,0 +1,176 @@ + + + + + External module: "fs/fs" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/fs_node_.html b/zh-cn/api/modules/fs_node_.html new file mode 100644 index 000000000..ef1246b63 --- /dev/null +++ b/zh-cn/api/modules/fs_node_.html @@ -0,0 +1,322 @@ + + + + + External module: "fs/node" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "fs/node"

+ + + +
+
+

Variables

Const readFileAsync

readFileAsync: function = _.promisify<string, string, string>(nodeReadFile)

+

Defined in fs/node.ts:6

+

Type declaration:

▸ (arg1: T1, arg2: T2): Promise‹T3›

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
arg1T1
arg2T2
+
+

Const statAsync

statAsync: function = _.promisify(stat)

+

Defined in fs/node.ts:5

+

Type declaration:

▸ (arg1: T1): Promise‹T2›

+

Parameters:

+ + + + + + + + + + + +
NameType
arg1T1
+

Functions

exists

exists(filepath: string): Promise‹boolean›

+

Defined in fs/node.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹boolean›

+
+

existsSync

existsSync(filepath: string): boolean

+

Defined in fs/node.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: boolean

+
+

fallback

fallback(file: string): undefined | string

+

Defined in fs/node.ts:29

+

Parameters:

+ + + + + + + + + + + +
NameType
filestring
+

Returns: undefined | string

+
+

readFile

readFile(filepath: string): Promise‹string›

+

Defined in fs/node.ts:11

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: Promise‹string›

+
+

readFileSync

readFileSync(filepath: string): string

+

Defined in fs/node.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
filepathstring
+

Returns: string

+
+

resolve

resolve(root: string, file: string, ext: string): string

+

Defined in fs/node.ts:25

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
rootstring
filestring
extstring
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/liquid_.html b/zh-cn/api/modules/liquid_.html new file mode 100644 index 000000000..676b2a491 --- /dev/null +++ b/zh-cn/api/modules/liquid_.html @@ -0,0 +1,176 @@ + + + + + External module: "liquid" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/liquid_options_.html b/zh-cn/api/modules/liquid_options_.html new file mode 100644 index 000000000..daa8180fd --- /dev/null +++ b/zh-cn/api/modules/liquid_options_.html @@ -0,0 +1,273 @@ + + + + + External module: "liquid-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "liquid-options"

+ + + +
+
+

Functions

applyDefault

applyDefault(options: NormalizedOptions): NormalizedFullOptions

+

Defined in liquid-options.ts:133

+

Parameters:

+ + + + + + + + + + + +
NameType
optionsNormalizedOptions
+

Returns: NormalizedFullOptions

+
+

normalize

normalize(options?: LiquidOptions): NormalizedOptions

+

Defined in liquid-options.ts:115

+

Parameters:

+ + + + + + + + + + + +
NameType
options?LiquidOptions
+

Returns: NormalizedOptions

+
+

normalizeStringArray

normalizeStringArray(value: any): string[]

+

Defined in liquid-options.ts:137

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: string[]

+

Object literals

Const defaultOptions

defaultOptions: object

Defined in liquid-options.ts:89

+

cache

cache: undefined = undefined

+

Defined in liquid-options.ts:91

+

dynamicPartials

dynamicPartials: true = true

+

Defined in liquid-options.ts:94

+

extname

extname: string = “”

+

Defined in liquid-options.ts:92

+

fs

fs: “fs/node” = fs

+

Defined in liquid-options.ts:93

+

globals

globals: object

+

Defined in liquid-options.ts:109

+

Type declaration:

greedy

greedy: true = true

+

Defined in liquid-options.ts:100

+

jsTruthy

jsTruthy: false = false

+

Defined in liquid-options.ts:95

+

keepOutputType

keepOutputType: false = false

+

Defined in liquid-options.ts:110

+

lenientIf

lenientIf: false = false

+

Defined in liquid-options.ts:108

+

operators

operators: Operators = defaultOperators

+

Defined in liquid-options.ts:111

+

operatorsTrie

operatorsTrie: Trie = createTrie(defaultOperators)

+

Defined in liquid-options.ts:112

+

outputDelimiterLeft

outputDelimiterLeft: string = “{{“

+

Defined in liquid-options.ts:103

+

outputDelimiterRight

outputDelimiterRight: string = “}}”

+

Defined in liquid-options.ts:104

+

preserveTimezones

preserveTimezones: false = false

+

Defined in liquid-options.ts:105

+

root

root: string[] = [‘.’]

+

Defined in liquid-options.ts:90

+

strictFilters

strictFilters: false = false

+

Defined in liquid-options.ts:106

+

strictVariables

strictVariables: false = false

+

Defined in liquid-options.ts:107

+

tagDelimiterLeft

tagDelimiterLeft: string = “{%“

+

Defined in liquid-options.ts:101

+

tagDelimiterRight

tagDelimiterRight: string = “%}”

+

Defined in liquid-options.ts:102

+

trimOutputLeft

trimOutputLeft: false = false

+

Defined in liquid-options.ts:99

+

trimOutputRight

trimOutputRight: false = false

+

Defined in liquid-options.ts:98

+

trimTagLeft

trimTagLeft: false = false

+

Defined in liquid-options.ts:97

+

trimTagRight

trimTagRight: false = false

+

Defined in liquid-options.ts:96

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_filter_arg_.html b/zh-cn/api/modules/parser_filter_arg_.html new file mode 100644 index 000000000..f5be0f20a --- /dev/null +++ b/zh-cn/api/modules/parser_filter_arg_.html @@ -0,0 +1,197 @@ + + + + + External module: "parser/filter-arg" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/filter-arg"

+ + + +
+
+

Type aliases

FilterArg

Ƭ FilterArg: ValueToken | KeyValuePair

+

Defined in parser/filter-arg.ts:6

+
+

KeyValuePair

Ƭ KeyValuePair: [undefined | string, undefined | QuotedToken | PropertyAccessToken | LiteralToken | RangeToken]

+

Defined in parser/filter-arg.ts:4

+

Functions

isKeyValuePair

isKeyValuePair(arr: FilterArg): boolean

+

Defined in parser/filter-arg.ts:8

+

Parameters:

+ + + + + + + + + + + +
NameType
arrFilterArg
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_match_operator_.html b/zh-cn/api/modules/parser_match_operator_.html new file mode 100644 index 000000000..67a079771 --- /dev/null +++ b/zh-cn/api/modules/parser_match_operator_.html @@ -0,0 +1,209 @@ + + + + + External module: "parser/match-operator" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/match-operator"

+ + + +
+
+

Functions

matchOperator

matchOperator(str: string, begin: number, trie: Trie, end: number): number

+

Defined in parser/match-operator.ts:4

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strstring-
beginnumber-
trieTrie-
endnumberstr.length
+

Returns: number

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_parse_stream_.html b/zh-cn/api/modules/parser_parse_stream_.html new file mode 100644 index 000000000..51a7f86c2 --- /dev/null +++ b/zh-cn/api/modules/parser_parse_stream_.html @@ -0,0 +1,196 @@ + + + + + External module: "parser/parse-stream" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + +
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_parse_string_literal_.html b/zh-cn/api/modules/parser_parse_string_literal_.html new file mode 100644 index 000000000..da37b8bfa --- /dev/null +++ b/zh-cn/api/modules/parser_parse_string_literal_.html @@ -0,0 +1,227 @@ + + + + + External module: "parser/parse-string-literal" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/parse-string-literal"

+ + + +
+
+

Variables

Const rHex

rHex: RegExp = /[\da-fA-F]/

+

Defined in parser/parse-string-literal.ts:1

+
+

Const rOct

rOct: RegExp = /[0-7]/

+

Defined in parser/parse-string-literal.ts:2

+

Functions

hexVal

hexVal(c: string): number

+

Defined in parser/parse-string-literal.ts:12

+

Parameters:

+ + + + + + + + + + + +
NameType
cstring
+

Returns: number

+
+

parseStringLiteral

parseStringLiteral(str: string): string

+

Defined in parser/parse-string-literal.ts:19

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+

Object literals

Const escapeChar

escapeChar: object

Defined in parser/parse-string-literal.ts:3

+

b

b: string = “”

+

Defined in parser/parse-string-literal.ts:4

+

f

f: string = “ “

+

Defined in parser/parse-string-literal.ts:5

+

n

n: string = “

+

Defined in parser/parse-string-literal.ts:6

+

r

r: string = “

+

Defined in parser/parse-string-literal.ts:7

+

t

t: string = “ “

+

Defined in parser/parse-string-literal.ts:8

+

v

v: string = “ “

+

Defined in parser/parse-string-literal.ts:9

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_parser_.html b/zh-cn/api/modules/parser_parser_.html new file mode 100644 index 000000000..ef98b2913 --- /dev/null +++ b/zh-cn/api/modules/parser_parser_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/parser" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_token_kind_.html b/zh-cn/api/modules/parser_token_kind_.html new file mode 100644 index 000000000..95b4ae072 --- /dev/null +++ b/zh-cn/api/modules/parser_token_kind_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/token-kind" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_tokenizer_.html b/zh-cn/api/modules/parser_tokenizer_.html new file mode 100644 index 000000000..9b2050413 --- /dev/null +++ b/zh-cn/api/modules/parser_tokenizer_.html @@ -0,0 +1,176 @@ + + + + + External module: "parser/tokenizer" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/parser_whitespace_ctrl_.html b/zh-cn/api/modules/parser_whitespace_ctrl_.html new file mode 100644 index 000000000..403d028d6 --- /dev/null +++ b/zh-cn/api/modules/parser_whitespace_ctrl_.html @@ -0,0 +1,238 @@ + + + + + External module: "parser/whitespace-ctrl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "parser/whitespace-ctrl"

+ + + +
+
+

Functions

trimLeft

trimLeft(token: Token, greedy: boolean): void

+

Defined in parser/whitespace-ctrl.ts:27

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenToken
greedyboolean
+

Returns: void

+
+

trimRight

trimRight(token: Token, greedy: boolean): void

+

Defined in parser/whitespace-ctrl.ts:34

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenToken
greedyboolean
+

Returns: void

+
+

whiteSpaceCtrl

whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void

+

Defined in parser/whitespace-ctrl.ts:6

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokensToken[]
optionsNormalizedFullOptions
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/render_boolean_.html b/zh-cn/api/modules/render_boolean_.html new file mode 100644 index 000000000..2d64bc1a8 --- /dev/null +++ b/zh-cn/api/modules/render_boolean_.html @@ -0,0 +1,217 @@ + + + + + External module: "render/boolean" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/boolean"

+ + + +
+
+

Functions

isFalsy

isFalsy(val: any, ctx: Context): boolean

+

Defined in render/boolean.ts:7

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valany
ctxContext
+

Returns: boolean

+
+

isTruthy

isTruthy(val: any, ctx: Context): boolean

+

Defined in render/boolean.ts:3

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
valany
ctxContext
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/render_emitter_.html b/zh-cn/api/modules/render_emitter_.html new file mode 100644 index 000000000..17131d116 --- /dev/null +++ b/zh-cn/api/modules/render_emitter_.html @@ -0,0 +1,176 @@ + + + + + External module: "render/emitter" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/render_expression_.html b/zh-cn/api/modules/render_expression_.html new file mode 100644 index 000000000..b8937ea35 --- /dev/null +++ b/zh-cn/api/modules/render_expression_.html @@ -0,0 +1,351 @@ + + + + + External module: "render/expression" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/expression"

+ + + +
+
+

Functions

evalLiteralToken

evalLiteralToken(token: LiteralToken): any

+

Defined in render/expression.ts:74

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenLiteralToken
+

Returns: any

+
+

evalNumberToken

evalNumberToken(token: NumberToken): number

+

Defined in render/expression.ts:60

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenNumberToken
+

Returns: number

+
+

evalOperatorToken

evalOperatorToken(operators: Operators, token: OperatorToken, lhs: any, rhs: any, ctx: Context): boolean

+

Defined in render/expression.ts:69

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameType
operatorsOperators
tokenOperatorToken
lhsany
rhsany
ctxContext
+

Returns: boolean

+
+

evalPropertyAccessToken

evalPropertyAccessToken(token: PropertyAccessToken, ctx: Context, lenient: boolean): null | object

+

Defined in render/expression.ts:49

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
tokenPropertyAccessToken
ctxContext
lenientboolean
+

Returns: null | object

+
+

evalQuotedToken

evalQuotedToken(token: QuotedToken): string

+

Defined in render/expression.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenQuotedToken
+

Returns: string

+
+

evalRangeToken

evalRangeToken(token: RangeToken, ctx: Context): number[]

+

Defined in render/expression.ts:78

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
tokenRangeToken
ctxContext
+

Returns: number[]

+
+

evalToken

evalToken(token: Token | undefined, ctx: Context, lenient: boolean): any

+

Defined in render/expression.ts:40

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
tokenToken | undefined-
ctxContext-
lenientbooleanfalse
+

Returns: any

+
+

toPostfix

toPostfix(tokens: IterableIterator‹Token›): IterableIterator‹Token

+

Defined in render/expression.ts:84

+

Parameters:

+ + + + + + + + + + + +
NameType
tokensIterableIterator‹Token
+

Returns: IterableIterator‹Token

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/render_operator_.html b/zh-cn/api/modules/render_operator_.html new file mode 100644 index 000000000..357b38f4c --- /dev/null +++ b/zh-cn/api/modules/render_operator_.html @@ -0,0 +1,365 @@ + + + + + External module: "render/operator" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "render/operator"

+ + + +
+
+

Object literals

Const defaultOperators

defaultOperators: object

Defined in render/operator.ts:10

+

!=

!=(l: any, r: any): boolean

+

Defined in render/operator.ts:16

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

<

<(l: any, r: any): boolean

+

Defined in render/operator.ts:26

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

<=

<=(l: any, r: any): boolean

+

Defined in render/operator.ts:36

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

==

==(l: any, r: any): boolean

+

Defined in render/operator.ts:11

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

>

>(l: any, r: any): boolean

+

Defined in render/operator.ts:21

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

>=

>=(l: any, r: any): boolean

+

Defined in render/operator.ts:31

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

and

and(l: any, r: any, ctx: Context): boolean

+

Defined in render/operator.ts:44

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lany
rany
ctxContext
+

Returns: boolean

+

contains

contains(l: any, r: any): boolean

+

Defined in render/operator.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
lany
rany
+

Returns: boolean

+

or

or(l: any, r: any, ctx: Context): boolean

+

Defined in render/operator.ts:45

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
lany
rany
ctxContext
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/render_render_.html b/zh-cn/api/modules/render_render_.html new file mode 100644 index 000000000..1c3162ae5 --- /dev/null +++ b/zh-cn/api/modules/render_render_.html @@ -0,0 +1,176 @@ + + + + + External module: "render/render" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_filter_filter_.html b/zh-cn/api/modules/template_filter_filter_.html new file mode 100644 index 000000000..dfcafccde --- /dev/null +++ b/zh-cn/api/modules/template_filter_filter_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_filter_filter_impl_.html b/zh-cn/api/modules/template_filter_filter_impl_.html new file mode 100644 index 000000000..fe1f8466a --- /dev/null +++ b/zh-cn/api/modules/template_filter_filter_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_filter_filter_impl_options_.html b/zh-cn/api/modules/template_filter_filter_impl_options_.html new file mode 100644 index 000000000..70c8bb516 --- /dev/null +++ b/zh-cn/api/modules/template_filter_filter_impl_options_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-impl-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_filter_filter_map_.html b/zh-cn/api/modules/template_filter_filter_map_.html new file mode 100644 index 000000000..594f79e15 --- /dev/null +++ b/zh-cn/api/modules/template_filter_filter_map_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/filter/filter-map" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_html_.html b/zh-cn/api/modules/template_html_.html new file mode 100644 index 000000000..ee6d48144 --- /dev/null +++ b/zh-cn/api/modules/template_html_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/html" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_output_.html b/zh-cn/api/modules/template_output_.html new file mode 100644 index 000000000..acf8c9ce6 --- /dev/null +++ b/zh-cn/api/modules/template_output_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/output" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_tag_hash_.html b/zh-cn/api/modules/template_tag_hash_.html new file mode 100644 index 000000000..4319c43b6 --- /dev/null +++ b/zh-cn/api/modules/template_tag_hash_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/hash" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_tag_tag_.html b/zh-cn/api/modules/template_tag_tag_.html new file mode 100644 index 000000000..30cf6fce8 --- /dev/null +++ b/zh-cn/api/modules/template_tag_tag_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_tag_tag_impl_.html b/zh-cn/api/modules/template_tag_tag_impl_.html new file mode 100644 index 000000000..c38a2f20b --- /dev/null +++ b/zh-cn/api/modules/template_tag_tag_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_tag_tag_impl_options_.html b/zh-cn/api/modules/template_tag_tag_impl_options_.html new file mode 100644 index 000000000..30e0c353d --- /dev/null +++ b/zh-cn/api/modules/template_tag_tag_impl_options_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-impl-options" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_tag_tag_map_.html b/zh-cn/api/modules/template_tag_tag_map_.html new file mode 100644 index 000000000..db990bfb2 --- /dev/null +++ b/zh-cn/api/modules/template_tag_tag_map_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/tag/tag-map" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_template_.html b/zh-cn/api/modules/template_template_.html new file mode 100644 index 000000000..e3707eaaf --- /dev/null +++ b/zh-cn/api/modules/template_template_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/template" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_template_impl_.html b/zh-cn/api/modules/template_template_impl_.html new file mode 100644 index 000000000..3a40c51f3 --- /dev/null +++ b/zh-cn/api/modules/template_template_impl_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/template-impl" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/template_value_.html b/zh-cn/api/modules/template_value_.html new file mode 100644 index 000000000..001cfea1f --- /dev/null +++ b/zh-cn/api/modules/template_value_.html @@ -0,0 +1,176 @@ + + + + + External module: "template/value" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_delimited_token_.html b/zh-cn/api/modules/tokens_delimited_token_.html new file mode 100644 index 000000000..38181f06b --- /dev/null +++ b/zh-cn/api/modules/tokens_delimited_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/delimited-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_filter_token_.html b/zh-cn/api/modules/tokens_filter_token_.html new file mode 100644 index 000000000..e1b09012e --- /dev/null +++ b/zh-cn/api/modules/tokens_filter_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/filter-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_hash_token_.html b/zh-cn/api/modules/tokens_hash_token_.html new file mode 100644 index 000000000..02388ad98 --- /dev/null +++ b/zh-cn/api/modules/tokens_hash_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/hash-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_html_token_.html b/zh-cn/api/modules/tokens_html_token_.html new file mode 100644 index 000000000..71aecb67a --- /dev/null +++ b/zh-cn/api/modules/tokens_html_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/html-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_identifier_token_.html b/zh-cn/api/modules/tokens_identifier_token_.html new file mode 100644 index 000000000..11921545f --- /dev/null +++ b/zh-cn/api/modules/tokens_identifier_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/identifier-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_literal_token_.html b/zh-cn/api/modules/tokens_literal_token_.html new file mode 100644 index 000000000..bfc26a26e --- /dev/null +++ b/zh-cn/api/modules/tokens_literal_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/literal-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_number_token_.html b/zh-cn/api/modules/tokens_number_token_.html new file mode 100644 index 000000000..c8cf37621 --- /dev/null +++ b/zh-cn/api/modules/tokens_number_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/number-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_operator_token_.html b/zh-cn/api/modules/tokens_operator_token_.html new file mode 100644 index 000000000..9c3a82754 --- /dev/null +++ b/zh-cn/api/modules/tokens_operator_token_.html @@ -0,0 +1,195 @@ + + + + + External module: "tokens/operator-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "tokens/operator-token"

+ + + +
+
+

Object literals

Const precedence

precedence: object

Defined in tokens/operator-token.ts:4

+

!=

!=: number = 1

+

Defined in tokens/operator-token.ts:6

+

<

<: number = 1

+

Defined in tokens/operator-token.ts:8

+

<=

<=: number = 1

+

Defined in tokens/operator-token.ts:10

+

==

==: number = 1

+

Defined in tokens/operator-token.ts:5

+

>

>: number = 1

+

Defined in tokens/operator-token.ts:7

+

>=

>=: number = 1

+

Defined in tokens/operator-token.ts:9

+

and

and: number = 0

+

Defined in tokens/operator-token.ts:12

+

contains

contains: number = 1

+

Defined in tokens/operator-token.ts:11

+

or

or: number = 0

+

Defined in tokens/operator-token.ts:13

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_output_token_.html b/zh-cn/api/modules/tokens_output_token_.html new file mode 100644 index 000000000..018590920 --- /dev/null +++ b/zh-cn/api/modules/tokens_output_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/output-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_property_access_token_.html b/zh-cn/api/modules/tokens_property_access_token_.html new file mode 100644 index 000000000..70c296342 --- /dev/null +++ b/zh-cn/api/modules/tokens_property_access_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/property-access-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_quoted_token_.html b/zh-cn/api/modules/tokens_quoted_token_.html new file mode 100644 index 000000000..f01577988 --- /dev/null +++ b/zh-cn/api/modules/tokens_quoted_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/quoted-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_range_token_.html b/zh-cn/api/modules/tokens_range_token_.html new file mode 100644 index 000000000..0337e126d --- /dev/null +++ b/zh-cn/api/modules/tokens_range_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/range-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_tag_token_.html b/zh-cn/api/modules/tokens_tag_token_.html new file mode 100644 index 000000000..e2b609109 --- /dev/null +++ b/zh-cn/api/modules/tokens_tag_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/tag-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_token_.html b/zh-cn/api/modules/tokens_token_.html new file mode 100644 index 000000000..ef517e85a --- /dev/null +++ b/zh-cn/api/modules/tokens_token_.html @@ -0,0 +1,176 @@ + + + + + External module: "tokens/token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_toplevel_token_.html b/zh-cn/api/modules/tokens_toplevel_token_.html new file mode 100644 index 000000000..b3cb3ce0a --- /dev/null +++ b/zh-cn/api/modules/tokens_toplevel_token_.html @@ -0,0 +1,178 @@ + + + + + External module: "tokens/toplevel-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/tokens_value_token_.html b/zh-cn/api/modules/tokens_value_token_.html new file mode 100644 index 000000000..1b54d48ba --- /dev/null +++ b/zh-cn/api/modules/tokens_value_token_.html @@ -0,0 +1,178 @@ + + + + + External module: "tokens/value-token" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/types_.html b/zh-cn/api/modules/types_.html new file mode 100644 index 000000000..e92da2fbd --- /dev/null +++ b/zh-cn/api/modules/types_.html @@ -0,0 +1,176 @@ + + + + + External module: "types" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_assert_.html b/zh-cn/api/modules/util_assert_.html new file mode 100644 index 000000000..8984ad207 --- /dev/null +++ b/zh-cn/api/modules/util_assert_.html @@ -0,0 +1,198 @@ + + + + + External module: "util/assert" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/assert"

+ + + +
+
+

Functions

assert

assert<T>(predicate: T | null | undefined, message?: undefined | function): void

+

Defined in util/assert.ts:3

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
predicateT | null | undefined
message?undefined | function
+

Returns: void

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_async_.html b/zh-cn/api/modules/util_async_.html new file mode 100644 index 000000000..458b02d2a --- /dev/null +++ b/zh-cn/api/modules/util_async_.html @@ -0,0 +1,310 @@ + + + + + External module: "util/async" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/async"

+ + + +
+
+

Type aliases

resolver

Ƭ resolver: function

+

Defined in util/async.ts:3

+

Type declaration:

▸ (x?: any): any

+

Parameters:

+ + + + + + + + + + + +
NameType
x?any
+

Functions

createRejectedThenable

createRejectedThenable(err: Error): Thenable

+

Defined in util/async.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
errError
+

Returns: Thenable

+
+

createResolvedThenable

createResolvedThenable(value: any): Thenable

+

Defined in util/async.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: Thenable

+
+

isAsyncIterator

isAsyncIterator(val: any): boolean

+

Defined in util/async.ts:33

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isThenable

isThenable(val: any): boolean

+

Defined in util/async.ts:29

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

toPromise

toPromise(val: IterableIterator‹any› | Thenable | any): Promise‹any›

+

Defined in util/async.ts:65

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: Promise‹any›

+
+

toThenable

toThenable(val: IterableIterator‹any› | Thenable | any): Thenable

+

Defined in util/async.ts:38

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: Thenable

+
+

toValue

toValue(val: IterableIterator‹any› | Thenable | any): any

+

Defined in util/async.ts:70

+

Parameters:

+ + + + + + + + + + + +
NameType
valIterableIterator‹any› | Thenable | any
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_character_.html b/zh-cn/api/modules/util_character_.html new file mode 100644 index 000000000..3a599bb5d --- /dev/null +++ b/zh-cn/api/modules/util_character_.html @@ -0,0 +1,199 @@ + + + + + External module: "util/character" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/character"

+ + + +
+
+

Variables

Const BLANK

BLANK: 4 = 4

+

Defined in util/character.ts:8

+
+

Const IDENTIFIER

IDENTIFIER: 1 = 1

+

Defined in util/character.ts:6

+
+

Const INLINE_BLANK

INLINE_BLANK: 16 = 16

+

Defined in util/character.ts:10

+
+

Const NUMBER

NUMBER: 32 = 32

+

Defined in util/character.ts:11

+
+

Const OPERATOR

OPERATOR: 2 = 2

+

Defined in util/character.ts:7

+
+

Const QUOTE

QUOTE: 8 = 8

+

Defined in util/character.ts:9

+
+

Const SIGN

SIGN: 64 = 64

+

Defined in util/character.ts:12

+
+

Const TYPES

TYPES: number[] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

+

Defined in util/character.ts:5

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_collection_.html b/zh-cn/api/modules/util_collection_.html new file mode 100644 index 000000000..7f21d20b7 --- /dev/null +++ b/zh-cn/api/modules/util_collection_.html @@ -0,0 +1,209 @@ + + + + + External module: "util/collection" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/collection"

+ + + +
+
+

Functions

toArray

toArray(val: any): any[]

+

Defined in util/collection.ts:10

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any[]

+
+

toEnumerable

toEnumerable(val: any): any[]

+

Defined in util/collection.ts:3

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any[]

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_error_.html b/zh-cn/api/modules/util_error_.html new file mode 100644 index 000000000..dc21505fb --- /dev/null +++ b/zh-cn/api/modules/util_error_.html @@ -0,0 +1,213 @@ + + + + + External module: "util/error" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/error"

+ + + +
+
+

Functions

mkContext

mkContext(token: Token): string

+

Defined in util/error.ts:82

+

Parameters:

+ + + + + + + + + + + +
NameType
tokenToken
+

Returns: string

+
+

mkMessage

mkMessage(msg: string, token: Token): string

+

Defined in util/error.ts:101

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
msgstring
tokenToken
+

Returns: string

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_literal_.html b/zh-cn/api/modules/util_literal_.html new file mode 100644 index 000000000..44d31a895 --- /dev/null +++ b/zh-cn/api/modules/util_literal_.html @@ -0,0 +1,191 @@ + + + + + External module: "util/literal" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/literal"

+ + + +
+
+

Variables

Const nil

nil: NullDrop = new NullDrop()

+

Defined in util/literal.ts:5

+

Object literals

Const literalValues

literalValues: object

Defined in util/literal.ts:6

+

blank

blank: BlankDrop = new BlankDrop()

+

Defined in util/literal.ts:12

+

empty

empty: EmptyDrop = new EmptyDrop()

+

Defined in util/literal.ts:11

+

false

false: boolean = false

+

Defined in util/literal.ts:8

+

nil

nil: NullDrop = nil

+

Defined in util/literal.ts:9

+

null

null: NullDrop = nil

+

Defined in util/literal.ts:10

+

true

true: boolean = true

+

Defined in util/literal.ts:7

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_operator_trie_.html b/zh-cn/api/modules/util_operator_trie_.html new file mode 100644 index 000000000..26e7ed09e --- /dev/null +++ b/zh-cn/api/modules/util_operator_trie_.html @@ -0,0 +1,192 @@ + + + + + External module: "util/operator-trie" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_strftime_.html b/zh-cn/api/modules/util_strftime_.html new file mode 100644 index 000000000..760679a35 --- /dev/null +++ b/zh-cn/api/modules/util_strftime_.html @@ -0,0 +1,928 @@ + + + + + External module: "util/strftime" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/strftime"

+ + + +
+
+

Variables

Const dayNames

dayNames: string[] = [
‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’
]

+

Defined in util/strftime.ts:8

+
+

Const dayNamesShort

dayNamesShort: string[] = dayNames.map(abbr)

+

Defined in util/strftime.ts:12

+
+

Const monthNames

monthNames: string[] = [
‘January’, ‘February’, ‘March’, ‘April’, ‘May’, ‘June’, ‘July’, ‘August’,
‘September’, ‘October’, ‘November’, ‘December’
]

+

Defined in util/strftime.ts:4

+
+

Const monthNamesShort

monthNamesShort: string[] = monthNames.map(abbr)

+

Defined in util/strftime.ts:11

+
+

Const rFormat

rFormat: RegExp = /%([-_0^#:]+)?(\d+)?([EO])?(.)/

+

Defined in util/strftime.ts:3

+

Functions

abbr

abbr(str: string): string

+

Defined in util/strftime.ts:25

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

century

century(d: Date): number

+

Defined in util/strftime.ts:58

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+
+

daysInMonth

daysInMonth(d: Date): number[]

+

Defined in util/strftime.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number[]

+
+

default

default(inputDate: Date, formatStr: string): string

+

Defined in util/strftime.ts:141

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
inputDateDate
formatStrstring
+

Returns: string

+
+

format

format(d: Date, match: RegExpExecArray): any

+

Defined in util/strftime.ts:160

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
matchRegExpExecArray
+

Returns: any

+
+

getDayOfYear

getDayOfYear(d: Date): number

+

Defined in util/strftime.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+
+

getSuffix

getSuffix(d: Date): any

+

Defined in util/strftime.ts:53

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: any

+
+

getWeekOfYear

getWeekOfYear(d: Date, startDay: number): string

+

Defined in util/strftime.ts:41

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
startDaynumber
+

Returns: string

+
+

isLeapYear

isLeapYear(d: Date): boolean

+

Defined in util/strftime.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: boolean

+

Object literals

Const formatCodes

formatCodes: object

Defined in util/strftime.ts:92

+

%

%(): string

+

Defined in util/strftime.ts:139

+

Returns: string

+

A

A(d: Date): string

+

Defined in util/strftime.ts:94

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

B

B(d: Date): string

+

Defined in util/strftime.ts:96

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

C

C(d: Date): number

+

Defined in util/strftime.ts:98

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

H

H(d: Date): number

+

Defined in util/strftime.ts:101

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

I

I(d: Date): string

+

Defined in util/strftime.ts:102

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

L

L(d: Date): number

+

Defined in util/strftime.ts:106

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

M

M(d: Date): number

+

Defined in util/strftime.ts:108

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

N

N(d: Date, opts: FormatOptions): any

+

Defined in util/strftime.ts:109

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
optsFormatOptions
+

Returns: any

+

P

P(d: Date): *”am” | “pm”*

+

Defined in util/strftime.ts:115

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: *”am” | “pm”*

+

S

S(d: Date): number

+

Defined in util/strftime.ts:118

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

U

U(d: Date): string

+

Defined in util/strftime.ts:120

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

W

W(d: Date): string

+

Defined in util/strftime.ts:122

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

X

X(d: Date): string

+

Defined in util/strftime.ts:124

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

Y

Y(d: Date): number

+

Defined in util/strftime.ts:126

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

a

a(d: Date): string

+

Defined in util/strftime.ts:93

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

b

b(d: Date): string

+

Defined in util/strftime.ts:95

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

c

c(d: Date): string

+

Defined in util/strftime.ts:97

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

d

d(d: Date): number

+

Defined in util/strftime.ts:99

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

e

e(d: Date): number

+

Defined in util/strftime.ts:100

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

j

j(d: Date): number

+

Defined in util/strftime.ts:103

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

k

k(d: Date): number

+

Defined in util/strftime.ts:104

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

l

l(d: Date): string

+

Defined in util/strftime.ts:105

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

m

m(d: Date): number

+

Defined in util/strftime.ts:107

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

n

n(): string

+

Defined in util/strftime.ts:138

+

Returns: string

+

p

p(d: Date): *”AM” | “PM”*

+

Defined in util/strftime.ts:114

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: *”AM” | “PM”*

+

q

q(d: Date): any

+

Defined in util/strftime.ts:116

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: any

+

s

s(d: Date): number

+

Defined in util/strftime.ts:117

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

t

t(): string

+

Defined in util/strftime.ts:137

+

Returns: string

+

u

u(d: Date): number

+

Defined in util/strftime.ts:119

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

w

w(d: Date): number

+

Defined in util/strftime.ts:121

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: number

+

x

x(d: Date): string

+

Defined in util/strftime.ts:123

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

y

y(d: Date): string

+

Defined in util/strftime.ts:125

+

Parameters:

+ + + + + + + + + + + +
NameType
dDate
+

Returns: string

+

z

z(d: Date, opts: FormatOptions): string

+

Defined in util/strftime.ts:127

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
dDate
optsFormatOptions
+

Returns: string

+
+

Const padChars

padChars: object

Defined in util/strftime.ts:80

+

A

A: string = “ “

+

Defined in util/strftime.ts:82

+

B

B: string = “ “

+

Defined in util/strftime.ts:84

+

P

P: string = “ “

+

Defined in util/strftime.ts:90

+

a

a: string = “ “

+

Defined in util/strftime.ts:81

+

b

b: string = “ “

+

Defined in util/strftime.ts:83

+

c

c: string = “ “

+

Defined in util/strftime.ts:85

+

e

e: string = “ “

+

Defined in util/strftime.ts:86

+

k

k: string = “ “

+

Defined in util/strftime.ts:87

+

l

l: string = “ “

+

Defined in util/strftime.ts:88

+

p

p: string = “ “

+

Defined in util/strftime.ts:89

+
+

Const padWidths

padWidths: object

Defined in util/strftime.ts:63

+

H

H: number = 2

+

Defined in util/strftime.ts:66

+

I

I: number = 2

+

Defined in util/strftime.ts:67

+

L

L: number = 3

+

Defined in util/strftime.ts:71

+

M

M: number = 2

+

Defined in util/strftime.ts:73

+

S

S: number = 2

+

Defined in util/strftime.ts:74

+

U

U: number = 2

+

Defined in util/strftime.ts:75

+

W

W: number = 2

+

Defined in util/strftime.ts:76

+

d

d: number = 2

+

Defined in util/strftime.ts:64

+

e

e: number = 2

+

Defined in util/strftime.ts:65

+

j

j: number = 3

+

Defined in util/strftime.ts:68

+

k

k: number = 2

+

Defined in util/strftime.ts:69

+

l

l: number = 2

+

Defined in util/strftime.ts:70

+

m

m: number = 2

+

Defined in util/strftime.ts:72

+
+

Const suffixes

suffixes: object

Defined in util/strftime.ts:13

+

1

1: string = “st”

+

Defined in util/strftime.ts:14

+

2

2: string = “nd”

+

Defined in util/strftime.ts:15

+

3

3: string = “rd”

+

Defined in util/strftime.ts:16

+

default

default: string = “th”

+

Defined in util/strftime.ts:17

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_type_guards_.html b/zh-cn/api/modules/util_type_guards_.html new file mode 100644 index 000000000..10c7c674b --- /dev/null +++ b/zh-cn/api/modules/util_type_guards_.html @@ -0,0 +1,379 @@ + + + + + External module: "util/type-guards" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/type-guards"

+ + + +
+
+

Functions

getKind

getKind(val: any): any

+

Defined in util/type-guards.ts:58

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: any

+
+

isDelimitedToken

isDelimitedToken(val: any): boolean

+

Defined in util/type-guards.ts:14

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isHTMLToken

isHTMLToken(val: any): boolean

+

Defined in util/type-guards.ts:22

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isLiteralToken

isLiteralToken(val: any): boolean

+

Defined in util/type-guards.ts:38

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isNumberToken

isNumberToken(val: any): boolean

+

Defined in util/type-guards.ts:42

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isOperatorToken

isOperatorToken(val: any): boolean

+

Defined in util/type-guards.ts:18

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isOutputToken

isOutputToken(val: any): boolean

+

Defined in util/type-guards.ts:26

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isPropertyAccessToken

isPropertyAccessToken(val: any): boolean

+

Defined in util/type-guards.ts:46

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isQuotedToken

isQuotedToken(val: any): boolean

+

Defined in util/type-guards.ts:34

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isRangeToken

isRangeToken(val: any): boolean

+

Defined in util/type-guards.ts:54

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isTagToken

isTagToken(val: any): boolean

+

Defined in util/type-guards.ts:30

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+
+

isWordToken

isWordToken(val: any): boolean

+

Defined in util/type-guards.ts:50

+

Parameters:

+ + + + + + + + + + + +
NameType
valany
+

Returns: boolean

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/api/modules/util_underscore_.html b/zh-cn/api/modules/util_underscore_.html new file mode 100644 index 000000000..19dc5d237 --- /dev/null +++ b/zh-cn/api/modules/util_underscore_.html @@ -0,0 +1,706 @@ + + + + + External module: "util/underscore" | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

External module: "util/underscore"

+ + + +
+
+

Variables

Const toLowerCase

toLowerCase: toLowerCase = String.prototype.toLowerCase

+

Defined in util/underscore.ts:4

+
+

Const toStr

toStr: toString = Object.prototype.toString

+

Defined in util/underscore.ts:3

+

Functions

caseInsensitiveCompare

caseInsensitiveCompare(a: any, b: any): 1 | 0 | -1

+

Defined in util/underscore.ts:140

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
aany
bany
+

Returns: 1 | 0 | -1

+
+

changeCase

changeCase(str: string): string

+

Defined in util/underscore.ts:130

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

ellipsis

ellipsis(str: string, N: number): string

+

Defined in util/underscore.ts:135

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
Nnumber
+

Returns: string

+
+

forOwn

forOwn<T>(object: object | undefined, iteratee: function): object

+

Defined in util/underscore.ts:66

+

Type parameters:

+

T

+

Parameters:

+

object: object | undefined

+

iteratee: function

+

▸ (val: T, key: string, obj: object): boolean | void

+

Parameters:

+ + + + + + + + + + + + + + + + + + + +
NameType
valT
keystring
objobject
+

Returns: object

+
    +
  • [ key: string]: T
  • +
+
+

identify

identify<T>(val: T): T

+

Defined in util/underscore.ts:119

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
valT
+

Returns: T

+
+

isArray

isArray(value: any): boolean

+

Defined in util/underscore.ts:53

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isFunction

isFunction(value: any): boolean

+

Defined in util/underscore.ts:15

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isNil

isNil(value: any): boolean

+

Defined in util/underscore.ts:49

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isNumber

isNumber(value: any): boolean

+

Defined in util/underscore.ts:40

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isObject

isObject(value: any): boolean

+

Defined in util/underscore.ts:91

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

isString

isString(value: any): boolean

+

Defined in util/underscore.ts:11

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: boolean

+
+

last

last<T>(arr: T[]): T

+

Defined in util/underscore.ts:79

+

Type parameters:

+

T

+

Parameters:

+ + + + + + + + + + + +
NameType
arrT[]
+

Returns: T

+

last(arr: string): string

+

Defined in util/underscore.ts:80

+

Parameters:

+ + + + + + + + + + + +
NameType
arrstring
+

Returns: string

+
+

pad

pad(str: any, length: number, ch: string, add: function): any

+

Defined in util/underscore.ts:112

+

Parameters:

+

str: any

+

length: number

+

ch: string

+

add: function

+

▸ (str: string, ch: string): string

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
strstring
chstring
+

Returns: any

+
+

padEnd

padEnd(str: any, length: number, ch: string): any

+

Defined in util/underscore.ts:108

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strany-
lengthnumber-
chstring“ “
+

Returns: any

+
+

padStart

padStart(str: any, length: number, ch: string): any

+

Defined in util/underscore.ts:104

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
strany-
lengthnumber-
chstring“ “
+

Returns: any

+
+

promisify

promisify<T1, T2>(fn: function): function

+

Defined in util/underscore.ts:19

+

Type parameters:

+

T1

+

T2

+

Parameters:

+

fn: function

+

▸ (arg1: T1, cb: function): void

+

Parameters:

+

arg1: T1

+

cb: function

+

▸ (err: Error | null, result: T2): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError | null
resultT2
+

Returns: function

+

▸ (arg1: T1): Promise‹T2›

+

Parameters:

+ + + + + + + + + + + +
NameType
arg1T1
+

promisify<T1, T2, T3>(fn: function): function

+

Defined in util/underscore.ts:20

+

Type parameters:

+

T1

+

T2

+

T3

+

Parameters:

+

fn: function

+

▸ (arg1: T1, arg2: T2, cb: function): void

+

Parameters:

+

arg1: T1

+

arg2: T2

+

cb: function

+

▸ (err: Error | null, result: T3): void

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
errError | null
resultT3
+

Returns: function

+

▸ (arg1: T1, arg2: T2): Promise‹T3›

+

Parameters:

+ + + + + + + + + + + + + + + +
NameType
arg1T1
arg2T2
+
+

range

range(start: number, stop: number, step: number): number[]

+

Defined in util/underscore.ts:96

+

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDefault
startnumber-
stopnumber-
stepnumber1
+

Returns: number[]

+
+

snakeCase

snakeCase(str: string): string

+

Defined in util/underscore.ts:123

+

Parameters:

+ + + + + + + + + + + +
NameType
strstring
+

Returns: string

+
+

stringify

stringify(value: any): string

+

Defined in util/underscore.ts:31

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: string

+
+

toLiquid

toLiquid(value: any): any

+

Defined in util/underscore.ts:44

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: any

+
+

toValue

toValue(value: any): any

+

Defined in util/underscore.ts:36

+

Parameters:

+ + + + + + + + + + + +
NameType
valueany
+

Returns: any

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/abs.html b/zh-cn/filters/abs.html new file mode 100644 index 000000000..675ab8d9c --- /dev/null +++ b/zh-cn/filters/abs.html @@ -0,0 +1,197 @@ + + + + + abs | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

abs

+ + + +
+
+

Added in: v1.9.1

+ +

返回数字的绝对值。

+

输入

+
{{ -17 | abs }}
+ +

输出

+
17
+ +

输入

+
{{ 4 | abs }}
+ +

输出

+
4
+ +

对于只包含数字的字符串也好使:

+

输入

+
{{ "-19.86" | abs }}
+ +

输出

+
19.86
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/append.html b/zh-cn/filters/append.html new file mode 100644 index 000000000..cc91ba31d --- /dev/null +++ b/zh-cn/filters/append.html @@ -0,0 +1,191 @@ + + + + + append | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

append

+ + + +
+
+

Added in: v1.9.1

+ +

连接两个字符串并返回结果。

+

输入

+
{{ "/my/fancy/url" | append: ".html" }}
+ +

输出

+
/my/fancy/url.html
+ +

也可以用于变量。

+

输入

+
{% assign filename = "/index.html" %}
{{ "website.com" | append: filename }}
+ +

输出

+

website.com/index.html
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/at_least.html b/zh-cn/filters/at_least.html new file mode 100644 index 000000000..e3f38a93a --- /dev/null +++ b/zh-cn/filters/at_least.html @@ -0,0 +1,190 @@ + + + + + at_least | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

at_least

+ + + +
+
+

Added in: v8.4.0

+ +

限制数字到某个最小值。

+

输入

+
{{ 4 | at_least: 5 }}
+ +

输出

+
5
+ +

输入

+
{{ 4 | at_least: 3 }}
+ +

输出

+
4
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/at_most.html b/zh-cn/filters/at_most.html new file mode 100644 index 000000000..f4281114a --- /dev/null +++ b/zh-cn/filters/at_most.html @@ -0,0 +1,190 @@ + + + + + at_most | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

at_most

+ + + +
+
+

Added in: v8.4.0

+ +

限制数字到某个最大值。

+

输入

+
{{ 4 | at_most: 5 }}
+ +

输出

+
4
+ +

输入

+
{{ 4 | at_most: 3 }}
+ +

输出

+
3
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/capitalize.html b/zh-cn/filters/capitalize.html new file mode 100644 index 000000000..dde868f07 --- /dev/null +++ b/zh-cn/filters/capitalize.html @@ -0,0 +1,191 @@ + + + + + capitalize | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

capitalize

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串首字母改为大写。

+

输入

+
{{ "title" | capitalize }}
+ +

输出

+
Title
+ +

capitalize 只会大写首字母,因此后续单词的不会受影响:

+

Input

+
{{ "my great title" | capitalize }}
+ +

输出

+
My great title
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/ceil.html b/zh-cn/filters/ceil.html new file mode 100644 index 000000000..5aadb89d5 --- /dev/null +++ b/zh-cn/filters/ceil.html @@ -0,0 +1,203 @@ + + + + + ceil | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

ceil

+ + + +
+
+

Added in: v1.9.1

+ +

向上取整,取整前 LiquidJS 会首先把输入转换为数字。

+

输入

+
{{ 1.2 | ceil }}
+ +

输出

+
2
+ +

输入

+
{{ 2.0 | ceil }}
+ +

输出

+
2
+ +

输入

+
{{ 183.357 | ceil }}
+ +

输出

+
184
+ +

下面的例子中输入是字符串:

+

输入

+
{{ "3.5" | ceil }}
+ +

输出

+
4
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/compact.html b/zh-cn/filters/compact.html new file mode 100644 index 000000000..a8a8afbdf --- /dev/null +++ b/zh-cn/filters/compact.html @@ -0,0 +1,192 @@ + + + + + compact | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

compact

+ + + +
+
+

Added in: v9.22.0

+ +

从数组里移除任何 nullundefined 值。

+

假设 site.pages 是网页列表,有些网页包含 category 属性用来标明类别。如果把它们 map 到数组里,那么对于没有 category 属性的元素就会是 undefined

+

输入

+
{% assign site_categories = site.pages | map: "category" %}

{% for category in site_categories %}
- {{ category }}
{% endfor %}
+ +

输出

+
- business
- celebrities
-
- lifestyle
- sports
-
- technology
+ +

使用 compact 创建 site_categories 数组,可以移除所有 nullundefined 值。

+

输入

+
{% assign site_categories = site.pages | map: "category" | compact %}

{% for category in site_categories %}
- {{ category }}
{% endfor %}
+ +

输出

+
- business
- celebrities
- lifestyle
- sports
- technology
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/concat.html b/zh-cn/filters/concat.html new file mode 100644 index 000000000..12855991f --- /dev/null +++ b/zh-cn/filters/concat.html @@ -0,0 +1,189 @@ + + + + + concat | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

concat

+ + + +
+
+

Concatenates (joins together) multiple arrays. The resulting array contains all the items from the input arrays.

+

输入

+
{% assign fruits = "apples, oranges, peaches" | split: ", " %}
{% assign vegetables = "carrots, turnips, potatoes" | split: ", " %}

{% assign everything = fruits | concat: vegetables %}

{% for item in everything %}
- {{ item }}
{% endfor %}
+ +

输出

+
- apples
- oranges
- peaches
- carrots
- turnips
- potatoes
+ +

You can string together concat filters to join more than two arrays:

+

输入

+
{% assign furniture = "chairs, tables, shelves" | split: ", " %}

{% assign everything = fruits | concat: vegetables | concat: furniture %}

{% for item in everything %}
- {{ item }}
{% endfor %}
+ +

输出

+
- apples
- oranges
- peaches
- carrots
- turnips
- potatoes
- chairs
- tables
- shelves
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/date.html b/zh-cn/filters/date.html new file mode 100644 index 000000000..44ea52960 --- /dev/null +++ b/zh-cn/filters/date.html @@ -0,0 +1,208 @@ + + + + + date | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

date

+ + + +
+
+

Added in: v1.9.1

+ +

把时间戳转换为字符串。LiquidJS 尝试跟 Shopify/Liquid 保持一致,它用的是 Ruby 核心的 Time#strftime(string)。此外 LiquidJS 会先通过 new Date() 尝试把输入转换为 Date 对象。

+

输入

+
{{ article.published_at | date: "%a, %b %d, %y" }}
+ +

输出

+
Fri, Jul 17, 15
+ +

输入

+
{{ article.published_at | date: "%Y" }}
+ +

输出

+
2015
+ +

对于包含格式正确的字符串也好使:

+

输入

+
{{ "March 14, 2016" | date: "%b %d, %y" }}
+ +

输出

+
Mar 14, 16
+ +

可以用特殊值 "now"(或"today")来获取当前时间:

+

输入

+
This page was last updated at {{ "now" | date: "%Y-%m-%d %H:%M" }}.
+ +

输出

+
This page was last updated at 2020-03-25 15:57.
+ +
当前时间

注意得到的当前时间是模板渲染时的时间,如果你在用静态站点生成器或者模板有被缓存这一时间可能与用户看到的时间不同。

+
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/default.html b/zh-cn/filters/default.html new file mode 100644 index 000000000..bb1e7d75c --- /dev/null +++ b/zh-cn/filters/default.html @@ -0,0 +1,199 @@ + + + + + default | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

default

+ + + +
+
+

Added in: v1.9.1

+ +

在值不存在时给一个默认值,如果左侧是 falsy 或空(stringArray)就会使用这个默认值。下面的例子中 product_price 没有定义,因此使用了默认值。

+

输入

+
{{ product_price | default: 2.99 }}
+ +

输出

+
2.99
+ +

下面的例子中定义了 product_price 所以没有使用默认值。

+

输入

+
{% assign product_price = 4.99 %}
{{ product_price | default: 2.99 }}
+ +

输出

+
4.99
+ +

下面例子中 product_price 为空,所以使用了默认值。

+

输入

+
{% assign product_price = "" %}
{{ product_price | default: 2.99 }}
+ +

输出

+
2.99
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/divided_by.html b/zh-cn/filters/divided_by.html new file mode 100644 index 000000000..e4d1ea446 --- /dev/null +++ b/zh-cn/filters/divided_by.html @@ -0,0 +1,194 @@ + + + + + divided_by | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

divided_by

+ + + +
+
+

Added in: v1.9.1

+ +

两数相除返回商,返回结果数字在 JavaScript 中 .toString() 得到的字符串。

+

输入

+
{{ 16 | divided_by: 4 }}
+ +

输出

+
4
+ +

输入

+
{{ 5 | divided_by: 3 }}
+ +

输出

+
1.6666666666666667
+ +
Integer Arithmetic

Since JavaScript doesn’t differentiate integers and floats, LiquidJS is not capable of integer arithmetic and the return type is always number, the string representation of which depends on its value.

+
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/downcase.html b/zh-cn/filters/downcase.html new file mode 100644 index 000000000..e2b06241a --- /dev/null +++ b/zh-cn/filters/downcase.html @@ -0,0 +1,190 @@ + + + + + downcase | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

downcase

+ + + +
+
+

Added in: v1.9.1

+ +

字符串中每个字符都转为小写,对已经是小写的字符没有影响。

+

输入

+
{{ "Parker Moore" | downcase }}
+ +

输出

+
parker moore
+ +

输入

+
{{ "apple" | downcase }}
+ +

输出

+
apple
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/escape.html b/zh-cn/filters/escape.html new file mode 100644 index 000000000..7c73ecc12 --- /dev/null +++ b/zh-cn/filters/escape.html @@ -0,0 +1,192 @@ + + + + + escape | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

escape

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串中的 HTML 特殊字符转义,对不需要转义的字符串不会产生影响。

+

输入

+
{{ "Have you read 'James & the Giant Peach'?" | escape }}
+ +

输出

+
+Have you read &#39;James &amp; the Giant Peach&#39;?
+
+ +

输入

+
{{ "Tetsuro Takara" | escape }}
+ +

输出

+
Tetsuro Takara
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/escape_once.html b/zh-cn/filters/escape_once.html new file mode 100644 index 000000000..0bb42eec6 --- /dev/null +++ b/zh-cn/filters/escape_once.html @@ -0,0 +1,196 @@ + + + + + escape_once | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

escape_once

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串中的特殊字符转义得到可用在 URL 里的字符串,对已经转义过的字符串和不需要转义的字符串不会产生影响。

+

输入

+
{{ "1 < 2 & 3" | escape_once }}
+ +

输出

+
+1 &lt; 2 &amp; 3
+
+ +

输入

+
+{{ "1 &lt; 2 &amp; 3" | escape_once }}
+
+ +

输出

+
+1 &lt; 2 &amp; 3
+
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/first.html b/zh-cn/filters/first.html new file mode 100644 index 000000000..98b543ea0 --- /dev/null +++ b/zh-cn/filters/first.html @@ -0,0 +1,193 @@ + + + + + first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

first

+ + + +
+
+

Added in: v1.9.1

+ +

返回数组的第一个元素。

+

输入

+
{{ "Ground control to Major Tom." | split: " " | first }}
+ +

输出

+
Ground
+ +

输入

+
{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}
{{ my_array.first }}
+ +

输出

+

zebra
+ +

需要在标签中使用的时候,可以用点来计算 first

+
{% if my_array.first == "zebra" %}
Here comes a zebra!
{% endif %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/floor.html b/zh-cn/filters/floor.html new file mode 100644 index 000000000..212a40f93 --- /dev/null +++ b/zh-cn/filters/floor.html @@ -0,0 +1,203 @@ + + + + + floor | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

floor

+ + + +
+
+

Added in: v1.9.1

+ +

数字下取整,LiquidJS 会尝试把输入转换为数字再做下取整操作。

+

输入

+
{{ 1.2 | floor }}
+ +

输出

+
1
+ +

输入

+
{{ 2.0 | floor }}
+ +

输出

+
2
+ +

输入

+
{{ 183.357 | floor }}
+ +

输出

+
183
+ +

下面的例子中输入是个数字:

+

输入

+
{{ "3.5" | floor }}
+ +

输出

+
3
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/join.html b/zh-cn/filters/join.html new file mode 100644 index 000000000..f3500c322 --- /dev/null +++ b/zh-cn/filters/join.html @@ -0,0 +1,184 @@ + + + + + join | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

join

+ + + +
+
+

Added in: v1.9.1

+ +

把数组中的元素连接成为一个字符串,以传入的参数作为分隔符。

+

输入

+
{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}
{{ beatles | join: " and " }}
+ +

输出

+

John and Paul and George and Ringo
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/json.html b/zh-cn/filters/json.html new file mode 100644 index 000000000..d7336c2d8 --- /dev/null +++ b/zh-cn/filters/json.html @@ -0,0 +1,184 @@ + + + + + json | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

json

+ + + +
+
+

Added in: v9.10.0

+ +

通过 JSON.stringify() 把值转换为字符串,多用于调试用途。

+

输入

+
{% assign arr = "foo bar coo" | split: " " %}
{{ arr | json }}
+ +

输出

+
["foo","bar","coo"]
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/last.html b/zh-cn/filters/last.html new file mode 100644 index 000000000..c133f61a4 --- /dev/null +++ b/zh-cn/filters/last.html @@ -0,0 +1,193 @@ + + + + + last | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

last

+ + + +
+
+

Added in: v1.9.1

+ +

返回数组的最后一个元素。

+

输入

+
{{ "Ground control to Major Tom." | split: " " | last }}
+ +

输出

+
Tom.
+ +

输入

+
{% assign my_array = "zebra, octopus, giraffe, tiger" | split: ", " %}
{{ my_array.last }}
+ +

输出

+

tiger
+ +

需要在标签中使用的时候,可以用点来计算 last

+
{% if my_array.last == "tiger" %}
There goes a tiger!
{% endif %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/lstrip.html b/zh-cn/filters/lstrip.html new file mode 100644 index 000000000..e77a2d15d --- /dev/null +++ b/zh-cn/filters/lstrip.html @@ -0,0 +1,184 @@ + + + + + lstrip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

lstrip

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串左侧的空白字符(制表符、空格、换行),不影响词之间的空格。

+

输入

+
BEGIN{{ "          So much room for activities!          " | lstrip }}END
+ +

输出

+
BEGINSo much room for activities!          END
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/map.html b/zh-cn/filters/map.html new file mode 100644 index 000000000..ef80286c2 --- /dev/null +++ b/zh-cn/filters/map.html @@ -0,0 +1,185 @@ + + + + + map | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

map

+ + + +
+
+

Added in: v1.9.1

+ +

按照属性名提取对象的属性形成另一个数组并返回。

+

下面的例子中假设 site.pages 包含了站点的所有网页元信息。使用 assignmap 过滤器创建了一个 site.pages 中所有对象的 category 属性的值构成的数组。

+

输入

+
{% assign all_categories = site.pages | map: "category" %}

{% for item in all_categories %}
- {{ item }}
{% endfor %}
+ +

输出

+
- business
- celebrities
- lifestyle
- sports
- technology
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/minus.html b/zh-cn/filters/minus.html new file mode 100644 index 000000000..91b34cf5b --- /dev/null +++ b/zh-cn/filters/minus.html @@ -0,0 +1,196 @@ + + + + + minus | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

minus

+ + + +
+
+

Added in: v1.9.1

+ +

两数相减。

+

输入

+
{{ 4 | minus: 2 }}
+ +

输出

+
2
+ +

输入

+
{{ 16 | minus: 4 }}
+ +

输出

+
12
+ +

输入

+
{{ 183.357 | minus: 12 }}
+ +

输出

+
171.357
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/modulo.html b/zh-cn/filters/modulo.html new file mode 100644 index 000000000..9245b9c7f --- /dev/null +++ b/zh-cn/filters/modulo.html @@ -0,0 +1,196 @@ + + + + + modulo | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

modulo

+ + + +
+
+

Added in: v1.9.1

+ +

返回两数相除的余数。

+

输入

+
{{ 3 | modulo: 2 }}
+ +

输出

+
1
+ +

输入

+
{{ 24 | modulo: 7 }}
+ +

输出

+
3
+ +

输入

+
{{ 183.357 | modulo: 12 }}
+ +

输出

+
3.3569999999999993
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/newline_to_br.html b/zh-cn/filters/newline_to_br.html new file mode 100644 index 000000000..ca86c1dba --- /dev/null +++ b/zh-cn/filters/newline_to_br.html @@ -0,0 +1,184 @@ + + + + + newline_to_br | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

newline_to_br

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串里的所有换行符(\n)替换为 HTML 换行(<br />)。

+

输入

+
{% capture string_with_newlines %}
Hello
there
{% endcapture %}

{{ string_with_newlines | newline_to_br }}
+ +

输出

+

<br/>Hello<br/>there<br/>
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/overview.html b/zh-cn/filters/overview.html new file mode 100644 index 000000000..567946f4e --- /dev/null +++ b/zh-cn/filters/overview.html @@ -0,0 +1,206 @@ + + + + + 过滤器 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

过滤器

+ + + +
+
+

LiquidJS 支持 Liquid 语法中具体业务无关的过滤器,基本上 shopify/liquid 核心 支持的 LiquidJS 都支持。这部分包含了所有 LiquidJS 支持的过滤器的文档和使用示例。

+

LiquidJS 共支持 40+ 个过滤器,可以分为如下几类:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
类别过滤器
数学plus, minus, modulo, times, floor, ceil, round, divided_by, abs
字符串append, prepend, capitalize, upcase, downcase, strip, lstrip, rstrip, strip_newlines, split, replace, replace_first, remove, remove_first, truncate, truncatewords
HTML/URIescape, escape_once, url_encode, url_decode, strip_html, newline_to_br
数组slice, map, sort, sort_natural, uniq, wheres, first, last, join, reverse
日期date
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/plus.html b/zh-cn/filters/plus.html new file mode 100644 index 000000000..6c3bce06f --- /dev/null +++ b/zh-cn/filters/plus.html @@ -0,0 +1,196 @@ + + + + + plus | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

plus

+ + + +
+
+

Added in: v1.9.1

+ +

两数相加。

+

输入

+
{{ 4 | plus: 2 }}
+ +

输出

+
6
+ +

输入

+
{{ 16 | plus: 4 }}
+ +

输出

+
20
+ +

输入

+
{{ 183.357 | plus: 12 }}
+ +

输出

+
195.357
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/prepend.html b/zh-cn/filters/prepend.html new file mode 100644 index 000000000..1f10f9def --- /dev/null +++ b/zh-cn/filters/prepend.html @@ -0,0 +1,191 @@ + + + + + prepend | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

prepend

+ + + +
+
+

Added in: v1.9.1

+ +

在字符串开头添加另一个字符串。

+

输入

+
{{ "apples, oranges, and bananas" | prepend: "Some fruit: " }}
+ +

输出

+
Some fruit: apples, oranges, and bananas
+ +

prepend 也可以用于变量。

+

输入

+
{% assign url = "example.com" %}
{{ "/index.html" | prepend: url }}
+ +

输出

+

example.com/index.html
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/remove.html b/zh-cn/filters/remove.html new file mode 100644 index 000000000..043539791 --- /dev/null +++ b/zh-cn/filters/remove.html @@ -0,0 +1,184 @@ + + + + + remove | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

remove

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串中出现的所有指定子字符串。

+

输入

+
{{ "I strained to see the train through the rain" | remove: "rain" }}
+ +

输出

+
I strained to see the t through the
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/remove_first.html b/zh-cn/filters/remove_first.html new file mode 100644 index 000000000..e9e3c1f28 --- /dev/null +++ b/zh-cn/filters/remove_first.html @@ -0,0 +1,184 @@ + + + + + remove_first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

remove_first

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串中出现的第一个指定子字符串。

+

输入

+
{{ "I strained to see the train through the rain" | remove_first: "rain" }}
+ +

输出

+
I strained to see the t through the rain
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/replace.html b/zh-cn/filters/replace.html new file mode 100644 index 000000000..9718385e8 --- /dev/null +++ b/zh-cn/filters/replace.html @@ -0,0 +1,184 @@ + + + + + replace | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

replace

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串中出现的每一个指定子字符串替换为另一个字符串。

+

输入

+
{{ "Take my protein pills and put my helmet on" | replace: "my", "your" }}
+ +

输出

+
Take your protein pills and put your helmet on
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/replace_first.html b/zh-cn/filters/replace_first.html new file mode 100644 index 000000000..0e39bb169 --- /dev/null +++ b/zh-cn/filters/replace_first.html @@ -0,0 +1,184 @@ + + + + + replace_first | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

replace_first

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串中出现的第一个指定子字符串替换为另一个字符串。

+

输入

+
{{ "Take my protein pills and put my helmet on" | replace_first: "my", "your" }}
+ +

输出

+
Take your protein pills and put my helmet on
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/reverse.html b/zh-cn/filters/reverse.html new file mode 100644 index 000000000..872591a29 --- /dev/null +++ b/zh-cn/filters/reverse.html @@ -0,0 +1,191 @@ + + + + + reverse | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

reverse

+ + + +
+
+

Added in: v1.9.1

+ +

反转数组的所有元素,不可用于字符串。

+

输入

+
{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}

{{ my_array | reverse | join: ", " }}
+ +

输出

+


plums, peaches, oranges, apples
+ +

尽管 reverse 不能直接用于字符串,可以把字符串分割成数组,反转后再连接成字符串:

+

输入

+
{{ "Ground control to Major Tom." | split: "" | reverse | join: "" }}
+ +

输出

+
.moT rojaM ot lortnoc dnuorG
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/round.html b/zh-cn/filters/round.html new file mode 100644 index 000000000..5b62eed47 --- /dev/null +++ b/zh-cn/filters/round.html @@ -0,0 +1,196 @@ + + + + + round | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

round

+ + + +
+
+

Added in: v1.9.1

+ +

数字四舍五入取整,如果传入小数位数作为参数。

+

输入

+
{{ 1.2 | round }}
+ +

输出

+
1
+ +

输入

+
{{ 2.7 | round }}
+ +

输出

+
3
+ +

输入

+
{{ 183.357 | round: 2 }}
+ +

输出

+
183.36
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/rstrip.html b/zh-cn/filters/rstrip.html new file mode 100644 index 000000000..70270974a --- /dev/null +++ b/zh-cn/filters/rstrip.html @@ -0,0 +1,184 @@ + + + + + rstrip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

rstrip

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串右侧的空白字符(制表符、空格、换行),不影响词之间的空格。

+

输入

+
BEGIN{{ "          So much room for activities!          " | rstrip }}END
+ +

输出

+
BEGIN          So much room for activities!END
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/size.html b/zh-cn/filters/size.html new file mode 100644 index 000000000..a9a3967ae --- /dev/null +++ b/zh-cn/filters/size.html @@ -0,0 +1,193 @@ + + + + + size | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

size

+ + + +
+
+

Added in: v1.9.1

+ +

返回字符串的字符个数或者数组的元素个数。

+

输入

+
{{ "Ground control to Major Tom." | size }}
+ +

输出

+
28
+ +

输入

+
{% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}

{{ my_array.size }}
+ +

输出

+


4
+ +

在标签里可以用点来计算 size

+
{% if site.pages.size > 10 %}
This is a big website!
{% endif %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/slice.html b/zh-cn/filters/slice.html new file mode 100644 index 000000000..d42e51597 --- /dev/null +++ b/zh-cn/filters/slice.html @@ -0,0 +1,203 @@ + + + + + slice | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

slice

+ + + +
+
+

Added in: v1.9.1

+ +

返回第一个参数为下标位置的一个字符,如果指定了第二个参数会被解释为子字符串的长度。字符串下标从零开始。

+

输入

+
{{ "Liquid" | slice: 0 }}
+ +

输出

+
L
+ +

输入

+
{{ "Liquid" | slice: 2 }}
+ +

输出

+
q
+ +

输入

+
{{ "Liquid" | slice: 2, 5 }}
+ +

输出

+
quid
+ +

If the first argument is a negative number, the indices are counted from the end of the string:

+

输入

+
{{ "Liquid" | slice: -3, 2 }}
+ +

输出

+
ui
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/sort.html b/zh-cn/filters/sort.html new file mode 100644 index 000000000..aa182554c --- /dev/null +++ b/zh-cn/filters/sort.html @@ -0,0 +1,187 @@ + + + + + sort | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

sort

+ + + +
+
+

Added in: v1.9.1

+ +

对数组中的元素排序,排序方式为 JavaScript Array.prototype.sort()

+

输入

+
{% assign my_array = "zebra, octopus, giraffe, Sally Snake" | split: ", " %}

{{ my_array | sort | join: ", " }}
+ +

输出

+


Sally Snake, giraffe, octopus, zebra
+ +

有一个参数来指定用元素的哪个属性排序。

+
{% assign products_by_price = collection.products | sort: "price" %}
{% for product in products_by_price %}
<h4>{{ product.title }}</h4>
{% endfor %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/sort_natural.html b/zh-cn/filters/sort_natural.html new file mode 100644 index 000000000..91564ca8d --- /dev/null +++ b/zh-cn/filters/sort_natural.html @@ -0,0 +1,187 @@ + + + + + sort_natural | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

sort_natural

+ + + +
+
+

Added in: v8.4.0

+ +

大小写不敏感地对数组元素排序。

+

输入

+
{% assign my_array = "zebra, octopus, giraffe, Sally Snake" | split: ", " %}

{{ my_array | sort_natural | join: ", " }}
+ +

输出

+


giraffe, octopus, Sally Snake, zebra
+ +

有一个参数来指定用元素的哪个属性排序。

+
{% assign products_by_company = collection.products | sort_natural: "company" %}
{% for product in products_by_company %}
<h4>{{ product.title }}</h4>
{% endfor %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/split.html b/zh-cn/filters/split.html new file mode 100644 index 000000000..45c4b67b7 --- /dev/null +++ b/zh-cn/filters/split.html @@ -0,0 +1,184 @@ + + + + + split | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

split

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串按照指定的分隔符进行分割,split 通常用于把逗号分隔的字符串转换为数组。

+

输入

+
{% assign beatles = "John, Paul, George, Ringo" | split: ", " %}

{% for member in beatles %}
{{ member }}
{% endfor %}
+ +

输出

+




John

Paul

George

Ringo
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/strip.html b/zh-cn/filters/strip.html new file mode 100644 index 000000000..c781eb2e9 --- /dev/null +++ b/zh-cn/filters/strip.html @@ -0,0 +1,184 @@ + + + + + strip | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串两侧的空白字符(制表符、空格、换行),不影响词之间的空格。

+

输入

+
BEGIN{{ "          So much room for activities!          " | strip }}END
+ +

输出

+
BEGINSo much room for activities!END
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/strip_html.html b/zh-cn/filters/strip_html.html new file mode 100644 index 000000000..b6a026a6d --- /dev/null +++ b/zh-cn/filters/strip_html.html @@ -0,0 +1,184 @@ + + + + + strip_html | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip_html

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串中的 HTML 标签。

+

输入

+
{{ "Have <em>you</em> read <strong>Ulysses</strong>?" | strip_html }}
+ +

输出

+
Have you read Ulysses?
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/strip_newlines.html b/zh-cn/filters/strip_newlines.html new file mode 100644 index 000000000..84d09c5ef --- /dev/null +++ b/zh-cn/filters/strip_newlines.html @@ -0,0 +1,184 @@ + + + + + strip_newlines | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

strip_newlines

+ + + +
+
+

Added in: v1.9.1

+ +

移除字符串中的换行符。

+

输入

+
{% capture string_with_newlines %}
Hello
there
{% endcapture %}

{{ string_with_newlines | strip_newlines }}
+ +

输出

+

Hellothere
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/times.html b/zh-cn/filters/times.html new file mode 100644 index 000000000..91d169dbf --- /dev/null +++ b/zh-cn/filters/times.html @@ -0,0 +1,196 @@ + + + + + times | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

times

+ + + +
+
+

Added in: v1.9.1

+ +

两数相乘。

+

输入

+
{{ 3 | times: 2 }}
+ +

输出

+
6
+ +

输入

+
{{ 24 | times: 7 }}
+ +

输出

+
168
+ +

输入

+
{{ 183.357 | times: 12 }}
+ +

输出

+
2200.284
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/truncate.html b/zh-cn/filters/truncate.html new file mode 100644 index 000000000..84c73d0db --- /dev/null +++ b/zh-cn/filters/truncate.html @@ -0,0 +1,198 @@ + + + + + truncate | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

truncate

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串截断为指定长度,可以指定一个数字表示截断到多少长度。最后会添加一个省略号(…)且记在长度里。

+

基本使用

输入

+
{{ "Ground control to Major Tom." | truncate: 20 }}
+ +

输出

+
Ground control to...
+ +

自定义省略号

truncate 的第二个可选参数用来指定后面追加的字符串,默认为省略号(…)。这个参数的长度会计算在第一个参数的长度里。例如,如果要把字符串截断到 10 个字符,并使用了一个 3 字符长度的省略号,那么第一个参数的值要设置到 13

+

输入

+
{{ "Ground control to Major Tom." | truncate: 25, ", and so on" }}
+ +

输出

+
Ground control, and so on
+ +

不要省略号

如果需要把字符串截断到特定长度且不要添加省略号,则把第二个参数设置为空字符串:

+

输入

+
{{ "Ground control to Major Tom." | truncate: 20, "" }}
+ +

输出

+
Ground control to Ma
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/truncatewords.html b/zh-cn/filters/truncatewords.html new file mode 100644 index 000000000..847138798 --- /dev/null +++ b/zh-cn/filters/truncatewords.html @@ -0,0 +1,198 @@ + + + + + truncatewords | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

truncatewords

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串截断为指定个数的单词,可以指定一个数字表示截断到多少个单词。最后会添加一个省略号(…)。

+

基本使用

输入

+
{{ "Ground control to Major Tom." | truncatewords: 3 }}
+ +

输出

+
Ground control to...
+ +

自定义省略号

truncate 的第二个可选参数用来指定后面追加的字符串,默认为省略号(…)。

+

输入

+
{{ "Ground control to Major Tom." | truncatewords: 3, "--" }}
+ +

输出

+
Ground control to--
+ +

不要省略号

如果不希望添加省略号,把第二个参数设置为空字符串即可:

+

输入

+
{{ "Ground control to Major Tom." | truncatewords: 3, "" }}
+ +

输出

+
Ground control to
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/uniq.html b/zh-cn/filters/uniq.html new file mode 100644 index 000000000..e0ff87efb --- /dev/null +++ b/zh-cn/filters/uniq.html @@ -0,0 +1,184 @@ + + + + + uniq | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

uniq

+ + + +
+
+

Added in: v1.9.1

+ +

移除数组中的重复元素。

+

输入

+
{% assign my_array = "ants, bugs, bees, bugs, ants" | split: ", " %}
{{ my_array | uniq | join: ", " }}
+ +

输出

+

ants, bugs, bees
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/upcase.html b/zh-cn/filters/upcase.html new file mode 100644 index 000000000..98483fc4d --- /dev/null +++ b/zh-cn/filters/upcase.html @@ -0,0 +1,190 @@ + + + + + upcase | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

upcase

+ + + +
+
+

Added in: v1.9.1

+ +

字符串中每个字符都转为大写,对已经是小写的字符没有影响。

+

输入

+
{{ "Parker Moore" | upcase }}
+ +

输出

+
PARKER MOORE
+ +

输入

+
{{ "APPLE" | upcase }}
+ +

输出

+
APPLE
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/url_decode.html b/zh-cn/filters/url_decode.html new file mode 100644 index 000000000..f71c7e247 --- /dev/null +++ b/zh-cn/filters/url_decode.html @@ -0,0 +1,184 @@ + + + + + url_decode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

url_decode

+ + + +
+
+

Added in: v6.1.0

+ +

把 URL 编码的字符串解码。

+

输入

+
{{ "%27Stop%21%27+said+Fred" | url_decode }}
+ +

输出

+
'Stop!' said Fred
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/url_encode.html b/zh-cn/filters/url_encode.html new file mode 100644 index 000000000..627fe8cca --- /dev/null +++ b/zh-cn/filters/url_encode.html @@ -0,0 +1,190 @@ + + + + + url_encode | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

url_encode

+ + + +
+
+

Added in: v1.9.1

+ +

把字符串中 URL 不安全的字符转义为百分号编码。

+

输入

+
{{ "john@liquid.com" | url_encode }}
+ +

输出

+
john%40liquid.com
+ +

输入

+
{{ "Tetsuro Takara" | url_encode }}
+ +

输出

+
Tetsuro+Takara
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/filters/where.html b/zh-cn/filters/where.html new file mode 100644 index 000000000..796abe148 --- /dev/null +++ b/zh-cn/filters/where.html @@ -0,0 +1,200 @@ + + + + + where | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

where

+ + + +
+
+

Added in: v8.1.0

+ +

按照数组中对象的属性值来过滤得到新数组,如果未指定第二个参数(属性值)则过滤得到所有属性值为 truthy 的对象。

+

下面的例子中,假设你有一个 products 列表并且希望展示其中的厨房产品。使用 where 过滤器可以得到一个只包含 "type" 属性值为 "kitchen" 的元素的数组。

+

输入

+
All products:
{% for product in products %}
- {{ product.title }}
{% endfor %}

{% assign kitchen_products = products | where: "type", "kitchen" %}

Kitchen products:
{% for product in kitchen_products %}
- {{ product.title }}
{% endfor %}
+ +

输出

+
All products:
- Vacuum
- Spatula
- Television
- Garlic press

Kitchen products:
- Spatula
- Garlic press
+ +

如果你有一个产品列表且希望只显示可用的产品,可以用 where 过滤器但不指定目标值,LiquidJS 会过滤得到 "available" 值为 truthy 的产品列表。

+

输入

+
All products:
{% for product in products %}
- {{ product.title }}
{% endfor %}

{% assign available_products = products | where: "available" %}

Available products:
{% for product in available_products %}
- {{ product.title }}
{% endfor %}
+ +

输出

+
All products:
- Coffee mug
- Limited edition sneakers
- Boring sneakers

Available products:
- Coffee mug
- Boring sneakers
+ +

where 后面再加一个 first 可以用来得到单个元素。例如,你要展示秋季系列里的单个 T-shirt。

+

输入

+
{% assign new_shirt = products | where: "type", "shirt" | first %}

Featured product: {{ new_shirt.title }}
+ +

输出

+
Featured product: Hawaiian print sweater vest
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/index.html b/zh-cn/index.html new file mode 100644 index 000000000..1d91b06ac --- /dev/null +++ b/zh-cn/index.html @@ -0,0 +1,266 @@ + + + + + LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
  • 安全渲染

    Liquid 模板有很强的可读性和容错性,适用于开放给设计师和客户。运算符和表达式都先解析到 AST 再去渲染,避免了 evalnew Function

  • 零依赖

    零 NPM 依赖且没有 Native 绑定的 Liquid 实现,Node.js 和浏览器通用。同时提供了 CDN 可用的 CMD, ESM 和 CJS 打包。

  • Shopify 兼容

    支持 shopify/liquid 的所有标签和过滤器,Jekyll 站点, Github PagesShopify 模板 都可以轻松迁移到 Node.js。

  • TypeScript

    整个项目在 TypeScript strict 模式下重写,让这个库拥有顺滑的使用体验,同时确保了一致的 API 和实时的、精确的文档。

+
    +
  • import { Liquid } from 'liquidjs'
  • +
  • const engine = new Liquid()
  • +
  • const tpl = engine.parse('Welcome to {{v}}!')
  • +
  • engine.render(tpl, {v: "Liquid"}).then(console.log)
  • +
  • // Outputs "Welcome to Liquid!"
  • +
+ +
+
+
+
+
+
+

贡献

+

LiquidJS 欢迎任何形式的贡献,可以从 阅读贡献指南 开始!感谢这些参与过 LiquidJS 项目的人:

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jun YangchenosZach LeathermanTim HardyPaul Robert LloydAlec LarsonPatrick Malouinjaswrks三三ssendevwojtask9Andrew BarclayCory MawhorterMehdi JafferyRobin BijlaniRyan KennedySami KukkonenScott SantucciSteven azuJoonasJamel A.Brandon PittmantgrandgentMartin SchusterRayCristofer GonzalesRaymond CamdenSteve StedmanAnthony CiccarelloBogdan ChadkinTejas ManoharPeter deHaanamit777Steffen SchuldenzuckerPixcellJason EtcovitchZCMemmie Lenglet
+ + + + + +
+
+
+
+
+
+
+

赞助

+

如果你喜欢 LiquidJS 或你的公司在使用 LiquidJS,请考虑 赞助 LiquidJS

+
+ +
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/playground.html b/zh-cn/playground.html new file mode 100644 index 000000000..a87081787 --- /dev/null +++ b/zh-cn/playground.html @@ -0,0 +1,149 @@ + + + + + LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+

演示

+
+
加载中...
+
加载中...
+
+ +
+
+ + + +
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/assign.html b/zh-cn/tags/assign.html new file mode 100644 index 000000000..2c4215163 --- /dev/null +++ b/zh-cn/tags/assign.html @@ -0,0 +1,191 @@ + + + + + Assign | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Assign

+ + + +
+
+

Added in: v1.9.1

+ +

创建一个新变量。

+

输入

+
{% assign my_variable = false %}
{% if my_variable != true %}
This statement is valid.
{% endif %}
+ +

输出

+
This statement is valid.
+ +

用引号(")包起来表示一个字符串。

+

输入

+
{% assign foo = "bar" %}
{{ foo }}
+ +

输出

+
bar
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/capture.html b/zh-cn/tags/capture.html new file mode 100644 index 000000000..8d987f72a --- /dev/null +++ b/zh-cn/tags/capture.html @@ -0,0 +1,191 @@ + + + + + capture | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

capture

+ + + +
+
+

Added in: v1.9.1

+ +

capture 开闭标签之间的内容渲染后赋值给一个变量,这个变量的类型总是字符串。

+

输入

+
{% capture my_variable %}I am being captured.{% endcapture %}
{{ my_variable }}
+ +

输出

+
I am being captured.
+ +

capture 里可以使用 assign 创建的其他变量来构建复杂字符串:

+

输入

+
{% assign favorite_food = "pizza" %}
{% assign age = 35 %}

{% capture about_me %}
I am {{ age }} and my favorite food is {{ favorite_food }}.
{% endcapture %}

{{ about_me }}
+ +

输出

+
I am 35 and my favourite food is pizza.
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/case.html b/zh-cn/tags/case.html new file mode 100644 index 000000000..25eab1e4f --- /dev/null +++ b/zh-cn/tags/case.html @@ -0,0 +1,184 @@ + + + + + case | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

case

+ + + +
+
+

Added in: v1.9.1

+ +

创建一个 switch 语句,把变量跟不同的值比较。case 创建 switch 语句,when 比较它的值。

+

输入

+
{% assign handle = "cake" %}
{% case handle %}
{% when "cake" %}
This is a cake
{% when "cookie", "biscuit" %}
This is a cookie
{% else %}
This is not a cake nor a cookie
{% endcase %}
+ +

输出

+
This is a cake
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/comment.html b/zh-cn/tags/comment.html new file mode 100644 index 000000000..dbaa27a95 --- /dev/null +++ b/zh-cn/tags/comment.html @@ -0,0 +1,184 @@ + + + + + Comment | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Comment

+ + + +
+
+

Added in: v1.9.1

+ +

让 Liquid 模板里一段代码不渲染。处于 comment 开闭标签之间的文本都不会输出,Liquid 代码都不会执行。

+

输入

+
Anything you put between {% comment %} and {% endcomment %} tags
is turned into a comment.
+ +

输出

+
Anything you put between  tags
is turned into a comment.
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/cycle.html b/zh-cn/tags/cycle.html new file mode 100644 index 000000000..1fff4ff6c --- /dev/null +++ b/zh-cn/tags/cycle.html @@ -0,0 +1,196 @@ + + + + + cycle | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

cycle

+ + + +
+
+

Added in: v1.9.1

+ +

循环一组字符串按照它们传入的顺序打印出来。每次调用 cycle 打印下一个参数。

+

基本使用

输入

+
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
{% cycle "one", "two", "three" %}
+ +

输出

+
one
two
three
one
+ +

cycle 可以用于:

+
    +
  • 对表格里每一行按奇偶应用不同样式
  • +
  • 对每行最后一项应用特殊样式
  • +
+

参数

一个模板中需要多个 cycle 时可以使用 “cycle 组” 参数。如果没有提供组名,使用同样参数调用的 cycle 会被认为处于同一组。

+

输入

+
{% cycle "first": "one", "two", "three" %}
{% cycle "second": "one", "two", "three" %}
{% cycle "second": "one", "two", "three" %}
{% cycle "first": "one", "two", "three" %}
+ +

输出

+
one
one
two
two
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/decrement.html b/zh-cn/tags/decrement.html new file mode 100644 index 000000000..2cc4b3c2c --- /dev/null +++ b/zh-cn/tags/decrement.html @@ -0,0 +1,186 @@ + + + + + Decrement | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Decrement

+ + + +
+
+

Added in: v1.9.1

+ +

创建一个新的数字类型的变量,每次调用都把它的值减一。第一次是 -1

+

输入

+
{% decrement variable %}
{% decrement variable %}
{% decrement variable %}
+ +

输出

+
-1
-2
-3
+ +

increment 一样,在 decrement 里声明的变量独立于 assigncapture 创建的变量。

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/for.html b/zh-cn/tags/for.html new file mode 100644 index 000000000..9321b2105 --- /dev/null +++ b/zh-cn/tags/for.html @@ -0,0 +1,249 @@ + + + + + For | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

For

+ + + +
+
+

Added in: v1.9.1

+ +

重复执行代码块的迭代标签。

+

基本使用

for…in

重复执行一段代码。

+

输入

+
{% for product in collection.products %}
{{ product.title }}
{% endfor %}
+ +

输出

+
hat shirt pants
+ +

else

指定 for 循环的集合长度为零时执行的代码块。

+

输入

+
{% for product in collection.products %}
{{ product.title }}
{% else %}
The collection is empty.
{% endfor %}
+ +

输出

+
The collection is empty.
+ +

break

遇到 break 标签时 for 循环停止执行。

+

输入

+
{% for i in (1..5) %}
{% if i == 4 %}
{% break %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
+ +

输出

+
1 2 3
+ +

continue

遇到 continue 标签时跳过当前这次迭代。

+

输入

+
{% for i in (1..5) %}
{% if i == 4 %}
{% continue %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
+ +

输出

+
1 2 3   5
+ +

forloop

for 循环里有一个 forloop 变量可用,用来表示迭代的当前状态。

+

forloop.first, forloop.lastforloop.length 属性:

+

输入

+
{% for i in (1..5) %}
{%- if forloop.first == true -%} First
{%- elsif forloop.last == true -%} Last
{%- else -%} {{ forloop.length }}
{%- endif %}
{% endfor -%}
+ +

输出

+
First
5
5
5
Last
+ +

forloop.index, forloop.index0, forloop.rindexforloop.rindex0 属性:

+

输入

+
index index0 rindex rindex0
{% for i in (1..5) %}
{{- forloop.index }} {{ forloop.index0 }} {{ forloop.rindex }} {{ forloop.rindex0 }}
{% endfor -%}
+ +

输出

+
index index0 rindex rindex0
1 0 5 4
2 1 4 3
3 2 3 2
4 3 2 1
5 4 1 0
+ +

参数

limit

限制循环执行的次数。

+

输入

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array limit:2 %}
{{ item }}
{% endfor %}
+ +

输出

+
1 2
+ +

offset

从指定的下标处开始循环。

+

输入

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array offset:2 %}
{{ item }}
{% endfor %}
+ +

输出

+
3 4 5 6
+ +

range

定义一个用于循环的数字范围。可以用字面量定义范围,也可以用变量定义范围。

+

输入

+
{% for i in (3..5) %}
{{ i }}
{% endfor %}

{% assign num = 4 %}
{% for i in (1..num) %}
{{ i }}
{% endfor %}
+ +

输出

+
3 4 5
1 2 3 4
+ +

reversed

反转循环的顺序。注意这个参数的拼写和过滤器 reverse 不同。

+

输入

+
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array reversed %}
{{ item }}
{% endfor %}
+ +

输出

+
6 5 4 3 2 1
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/if.html b/zh-cn/tags/if.html new file mode 100644 index 000000000..f2223a51a --- /dev/null +++ b/zh-cn/tags/if.html @@ -0,0 +1,192 @@ + + + + + If | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

If

+ + + +
+
+

Added in: v1.9.1

+ +

条件为 true 时执行某个代码块。

+

if

输入

+
{% if product.title == "Awesome Shoes" %}
These shoes are awesome!
{% endif %}
+ +

输出

+
These shoes are awesome!
+ +

elsif / else

ifunless 块中添加更多的条件。

+

输入

+
<!-- If customer.name = "anonymous" -->
{% if customer.name == "kevin" %}
Hey Kevin!
{% elsif customer.name == "anonymous" %}
Hey Anonymous!
{% else %}
Hi Stranger!
{% endif %}
+ +

输出

+
Hey Anonymous!
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/include.html b/zh-cn/tags/include.html new file mode 100644 index 000000000..00018a7d9 --- /dev/null +++ b/zh-cn/tags/include.html @@ -0,0 +1,195 @@ + + + + + Include | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Include

+ + + +
+
+

Added in: v1.9.1

+ +
已废弃

这个标签已经废弃,请使用封装更好的 render 标签。

+
+ +

引入一个模板

从模板 根路径 引入一个模板:

+
{% include 'footer.liquid' %}
+ +

设置 extname 选项为 ".liquid" 后上面的 .liquid 后缀就可以省略了,等价于:

+
{% include 'footer' %}
+ +

通过 include 渲染一个子模板时,它内部的代码可以访问父模板的变量,但父模板中不能访问它里面定义的变量。

+

变量传递

父模板里定义的变量可以通过 include 标签的参数列表传递给子模板:

+
{% assign my_variable = 'apples' %}
{% include 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

with 参数

使用 with...as 语法可以给子模板传递一个变量:

+
{% assign featured_product = all_products['product_handle'] %}
{% include 'product' with featured_product as product %}
+ +

上面的例子中,子模板中 product 会保有父模板中的 featured_product 变量的值。

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/increment.html b/zh-cn/tags/increment.html new file mode 100644 index 000000000..e59a31bd0 --- /dev/null +++ b/zh-cn/tags/increment.html @@ -0,0 +1,193 @@ + + + + + Increment | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Increment

+ + + +
+
+

Added in: v1.9.1

+ +

创建一个新的数字类型的变量,每次调用都把它的值加一。第一次为 0

+

输入

+
{% increment my_counter %}
{% increment my_counter %}
{% increment my_counter %}
+ +

输出

+
0
1
2
+ +

increment 里声明的变量独立于 assigncapture 创建的变量。

+

下面的例子中通过 assign 创建了变量 var。然后用 increment 标签在同名变量上多次递增。注意 increment 标签不会影响 assign 创建的 var 的值。

+

输入

+
{% assign var = 10 %}
{% increment var %}
{% increment var %}
{% increment var %}
{{ var }}
+ +

输出

+
0
1
2
10
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/layout.html b/zh-cn/tags/layout.html new file mode 100644 index 000000000..e00846c40 --- /dev/null +++ b/zh-cn/tags/layout.html @@ -0,0 +1,203 @@ + + + + + Layout | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Layout

+ + + +
+
+

Added in: v1.9.1

+ +

使用布局模板

套用模板 根路径 下的某个布局模板中。

+
{% layout 'footer.liquid' %}
+ +

设置 extname 选项为 ".liquid" 后上面的 .liquid 后缀就可以省略了,等价于:

+
{% layout 'footer' %}
+ +

通过 layout 渲染一个子模板时,它内部的代码可以访问父模板的变量,但父模板中不能访问它里面定义的变量。

+

变量传递

当前模板里定义的变量可以通过 layout 标签的参数列表传递给布局模板:

+
{% assign my_variable = 'apples' %}
{% layout 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

布局模板中可以包含若干 block 标签,这些 block 渲染时会按照子模板提供的内容进行填充。例如我们有布局模板 default-layout.liquid

+
Header
{% block content %}My default content{% endblock %}
Footer
+ +

它被子模板 page.liquid 通过 layout 标签引用:

+
{% layout "default-layout" %}
{% block content %}My page content{% endblock %}
+ +

page.liquid 的渲染结果将会是:

+
Header
My page content
Footer
+ +
    +
  • 一个布局模板中可以定义多个块;
  • +
  • 如果只有一个块,它的名字可以省略。
  • +
  • 如果子模板未定义块的内容,将会使用父模板中提供的默认内容。
  • +
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/overview.html b/zh-cn/tags/overview.html new file mode 100644 index 000000000..9b001d618 --- /dev/null +++ b/zh-cn/tags/overview.html @@ -0,0 +1,212 @@ + + + + + 标签 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

标签

+ + + +
+
+

LiquidJS 支持 Liquid 语法中具体业务无关的标签,包含 shopify/liquid 核心 里的所有标签。这部分包含了所有 LiquidJS 支持的标签的文档和使用示例。

+

LiquidJS 支持十几个过滤器,可以分为如下几类:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类别用途标签
迭代遍历一个集合for, cycle, tablerow
控制流控制模板渲染的执行分支if, unless, elif, else, case, when
变量定义和修改变量assign, increment, decrement
文件引入或继承其他模板render, include, layout
语言暂时禁用 Liquid 语法raw, comment
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/raw.html b/zh-cn/tags/raw.html new file mode 100644 index 000000000..8f08faff5 --- /dev/null +++ b/zh-cn/tags/raw.html @@ -0,0 +1,184 @@ + + + + + Raw | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Raw

+ + + +
+
+

Added in: v1.9.1

+ +

raw 标签可以暂时禁用 LiquidJS 的语法。生成和 Liquid 冲突的语言(比如 Nunjucks、Handlebars)时很有用。

+

输入

+
{% raw %}
In Handlebars, {{ this }} will be HTML-escaped, but
{{{ that }}} will not.
{% endraw %}
+ +

输出

+
In Handlebars, {{ this }} will be HTML-escaped, but {{{ that }}} will not.
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/render.html b/zh-cn/tags/render.html new file mode 100644 index 000000000..9e91a0e0a --- /dev/null +++ b/zh-cn/tags/render.html @@ -0,0 +1,202 @@ + + + + + Render | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Render

+ + + +
+
+

Added in: v9.2.0

+ +

基本使用

渲染一个模板

从模板 根路径 引入一个模板:

+
{% render 'footer.liquid' %}
+ +

设置 extname 选项为 ".liquid" 后上面的 .liquid 后缀就可以省略了,等价于:

+
{% render 'footer' %}
+ +
变量作用域

通过 render 渲染一个子模板时,它内部的代码不能访问父模板的变量,父模板中也不能访问它里面定义的变量。这个封装会让模板代码更容易理解和维护。

+
+ +

变量传递

父模板里定义的变量可以通过 render 标签的参数列表传递给子模板:

+
{% assign my_variable = 'apples' %}
{% render 'name', my_variable: my_variable, my_other_variable: 'oranges' %}
+ +

全局变量 不需要传递,所有文件都可以访问它们。

+

参数

with 参数

使用 with...as 语法可以给子模板传递一个变量:

+
{% assign featured_product = all_products['product_handle'] %}
{% render 'product' with featured_product as product %}
+ +

上面的例子中,子模板中 product 会保有父模板中的 featured_product 变量的值。

+

for 参数

for...as 语法可以对可枚举对象的每一个值渲染一次子模板:

+
{% assign variants = product.variants %}
{% render 'variant' for variants as variant %}
+ +

上面的例子中,对 product 的每个 variants 是指都会渲染一次子模板。子模板中 variant 变量会保有父模板中的 product.variants 中对应元素的值。

+
forloop 对象

使用 for 参数时,在子模板中可以访问 forloop 对象。

+
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/tablerow.html b/zh-cn/tags/tablerow.html new file mode 100644 index 000000000..2875a11eb --- /dev/null +++ b/zh-cn/tags/tablerow.html @@ -0,0 +1,200 @@ + + + + + Table Row | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Table Row

+ + + +
+
+

Added in: v1.9.1

+ +

生成一个 HTML 表示,上下必须用 <table></table> HTML 标签包裹起来。

+

基本使用

输入

+
<table>
{% tablerow product in collection.products %}
{{ product.title }}
{% endtablerow %}
</table>
+ +

输出

+
<table>
<tr class="row1">
<td class="col1">
Cool Shirt
</td>
<td class="col2">
Alien Poster
</td>
<td class="col3">
Batman Poster
</td>
<td class="col4">
Bullseye Shirt
</td>
<td class="col5">
Another Classic Vinyl
</td>
<td class="col6">
Awesome Jeans
</td>
</tr>
</table>
+ +

参数

cols

定义表格的列数。

+

输入

+
{% tablerow product in collection.products cols:2 %}
{{ product.title }}
{% endtablerow %}
+ +

输出

+
<table>
<tr class="row1">
<td class="col1">
Cool Shirt
</td>
<td class="col2">
Alien Poster
</td>
</tr>
<tr class="row2">
<td class="col1">
Batman Poster
</td>
<td class="col2">
Bullseye Shirt
</td>
</tr>
<tr class="row3">
<td class="col1">
Another Classic Vinyl
</td>
<td class="col2">
Awesome Jeans
</td>
</tr>
</table>
+ +

limit

限制迭代次数。

+
{% tablerow product in collection.products cols:2 limit:3 %}
{{ product.title }}
{% endtablerow %}
+ +

offset

从指定的下标处开始循环。

+
{% tablerow product in collection.products cols:2 offset:3 %}
{{ product.title }}
{% endtablerow %}
+ +

range

定义一个用于循环的数字范围。可以用字面量定义范围,也可以用变量定义范围。

+
<!--variable number example-->

{% assign num = 4 %}
<table>
{% tablerow i in (1..num) %}
{{ i }}
{% endtablerow %}
</table>

<!--literal number example-->

<table>
{% tablerow i in (3..5) %}
{{ i }}
{% endtablerow %}
</table>
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tags/unless.html b/zh-cn/tags/unless.html new file mode 100644 index 000000000..3e04ff1b1 --- /dev/null +++ b/zh-cn/tags/unless.html @@ -0,0 +1,187 @@ + + + + + Unless | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Unless

+ + + +
+
+

Added in: v1.9.1

+ +

if 相反 —— 条件 不满足 时执行代码块。

+

输入

+
{% unless product.title == "Awesome Shoes" %}
These shoes are not awesome.
{% endunless %}
+ +

输出

+
These shoes are not awesome.
+ +

等价于执行下面的代码:

+
{% if product.title != "Awesome Shoes" %}
These shoes are not awesome.
{% endif %}
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/caching.html b/zh-cn/tutorials/caching.html new file mode 100644 index 000000000..eefb02b91 --- /dev/null +++ b/zh-cn/tutorials/caching.html @@ -0,0 +1,189 @@ + + + + + 缓存 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

缓存

+ + + +
+
+

在典型的网站项目中,同一个模板文件可能会反复地用不同数据去渲染。在生产环境下模板文件的内容不太会发生变化(除非重新部署了服务),因此可以把从磁盘读取的文件内容和解析得到的模板结构(AST)缓存下来重复使用来节省渲染时间。

+

LiquidJS 在这一方面比较灵活,提供了多种不同的方式来达到提升性能的目的。

+

手动缓存

.parse(), .parseFile(), .parseFileSync() API 可以用来把字符串或文件解析成模板。得到的模板可以用不同的数据去重复地渲染得到不同的 HTML。

+

从字符串解析:

+
var tpl = engine.parse('{{name | capitalize}}');

engine.renderSync(tpl, {name: 'alice'}) // 'Alice'
engine.renderSync(tpl, {name: 'bob'}) // 'Bob'
+ +

从文件解析:

+
var tpl = engine.parseFileSync('hello');    // contents of `hello.liquid`: {{name}}

engine.renderSync(tpl, {name: 'alice'}) // 'Alice'
engine.renderSync(tpl, {name: 'bob'}) // 'Bob'
+ +

上述代码中字符串或文件只被解析了一次,可以反复利用去渲染不同的数据。有很多模板文件时可以把 tpl 变量存在 Map 中,后续再 .render() 时直接从 Map 中拿出解析好的模板去渲染。

+

cache 选项

如果你只用 .renderFile().renderFileSync() 也可以直接设置 [cache][cache] 选项,LiquidJS 会帮你缓存。

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
cache: true
});

// LiquidJS 将会解析 hello.liquid 然后用 {name: 'alice'} 渲染它
engine.renderFileSync('hello', {name: 'alice'})

// LiquidJS 会找到上次 hello.liquid 解析的结果模板,再用 {name: 'bob'} 渲染它
engine.renderFileSync('hello', {name: 'bob'})
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/contribution-guidelines.html b/zh-cn/tutorials/contribution-guidelines.html new file mode 100644 index 000000000..d881083fd --- /dev/null +++ b/zh-cn/tutorials/contribution-guidelines.html @@ -0,0 +1,187 @@ + + + + + 贡献指南 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

贡献指南

+ + + +
+
+

发起 Pull Request

代码风格:LiquidJS 采用 standard@typescript-eslint/recommended 规则,提交前确保可以通过风格检查:

+
npm run lint
+ +

测试:确保你改动之后测试仍然可以通过:

+
npm test
+ +

提交消息:请遵守 Angular 提交消息规范,尤其注意 type 标识,semantic-release 机器人依赖这个标识自动发布。

+

Star on Github 👉 harttle/liquidjs

这是支持我们最简单的方式:通过提升排名来让更多人了解,让它得到更好的改进。

+

成为赞助者!

LiquidJS 是开源的、免费的,并且 没有 商业支持,也 没有 任何广告。如果你喜欢 LiquidJS 或你的公司在使用 LiquidJS,请考虑通过 Open CollectivePatreon 赞助,作为感谢你的名字和头像(或 Logo)会展示在这里和 Github README

+

+

Become a Patron!

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/differences.html b/zh-cn/tutorials/differences.html new file mode 100644 index 000000000..d8f8bafc3 --- /dev/null +++ b/zh-cn/tutorials/differences.html @@ -0,0 +1,186 @@ + + + + + 和 Shopify/liquid 的区别 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

和 Shopify/liquid 的区别

+ + + +
+
+

Shopify/liquid 中的所有标签和过滤器 LiquidJS 都支持,但不包括 Shopify 主题中业务逻辑相关的标签和过滤器(如果你在找这些标签可以参考 插件列表,也欢迎把你的插件添加到列表中)。尽管原则上我们尽力兼容于 Shopify/liquid,但仍然存在一些区别:

+
    +
  • 真和假。在 LiquidJS 中 undefined, null, false 是假,之外的都是真;在 Ruby 中 nilfalse 是假,其他都是真。见 #26
  • +
  • 数字。JavaScript 不区分浮点数和整数,因此缺失一部分整数算术,见 #59。此外 size 过滤器作用于数字时总是返回零,而不是 Ruby 中的浮点数或整数的内存大小。
  • +
  • Drop 中的 .to_liquid() 替换为 .toLiquid()
  • +
  • 数据的 .to_s() 替换为 .toString()
  • +
  • 对象的迭代顺序。JavaScript 对象的迭代顺序是插入顺序和数字键递增顺序的组合,但 Ruby Hash 中只是插入顺序(JavaScript 字面量 Object 和 Ruby 字面量 Hash 的插入顺序解释也不同)。
  • +
  • 排序稳定性。shopify/liquid 和 LiquidJS 都没有定义 sort 过滤器的稳定性在,它取决于 Ruby/JavaScript 内置的排序算法,在 Node.js 12+ 和 Google Chrome 70+ LiquidJS 的排序是 稳定的
  • +
  • shopify/liquid 允许过滤器尾部的未匹配字符,但 LiquidJS 不允许。这就是说如果过滤器参数前忘记写冒号比如 {{ "a b" | split " "}} LiquidJS 会抛出异常。这是为了提升 Liquid 模板的易用性,参考 #208#212
  • +
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/intro-to-liquid.html b/zh-cn/tutorials/intro-to-liquid.html new file mode 100644 index 000000000..297cb0054 --- /dev/null +++ b/zh-cn/tutorials/intro-to-liquid.html @@ -0,0 +1,199 @@ + + + + + Liquid 模板语言简介 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

Liquid 模板语言简介

+ + + +
+
+

LiquidJS 是一个简单的、安全的、兼容 Shopify 的、纯 JavaScript 编写的模板引擎。这个项目的目的是为 JavaScript 社区提供一个 Liquid 模板引擎的实现。Liquid 最初用 Ruby 实现并用于 Github Pages, Jekyll 和 Shopify,参考 和 Shopify/liquid 的区别

+

LiquidJS 语法相对简单。LiquidJS 中有两种标记:

+
    +
  • 标签。标签由标签名和参数构成,由 {%%} 包裹。
  • +
  • 输出。输出由一个值和一组可选的过滤器构成,由 {{}} 包裹。
  • +
+

输出

输出 用于转换和输出变量到 HTMl。下面的模板将会把 username 的值插入到 input 的 value

+
<input type="text" name="user" value="{{username}}">
+ +

输出 里的值可以在输出之前经过若干个 过滤器 的转换。比如在变量后面追加一个字符串:

+
{{ username | append: ", welcome to LiquidJS!" }}
+ +

过滤器可以级联,用起来像管道一样:

+
{{ username | append: ", welcome to LiquidJS!" | capitalize }}
+ +

这里 是 LiquidJS 支持的完整的过滤器列表。

+

标签

标签 用于控制模板渲染过程,操作模板变量,和其他模板交互等。例如 assign 可以用来定义一个模板中可以使用的变量:

+
{% assign foo = "FOO" %}
+ +

一般标签成对地出现,一个开始标签和一个对应的结束标签,比如:

+
{% if foo == "FOO" %}
Variable `foo` equals "FOO"
{% else %}
Variable `foo` not equals "FOO"
{% endif %}
+ +

这里 是 LiquidJS 支持的完整的标签列表。

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/migrate-to-9.html b/zh-cn/tutorials/migrate-to-9.html new file mode 100644 index 000000000..123b088eb --- /dev/null +++ b/zh-cn/tutorials/migrate-to-9.html @@ -0,0 +1,197 @@ + + + + + 迁移到 LiquidJS 9 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

迁移到 LiquidJS 9

+ + + +
+
+

LiquidJS 9 有一些基础性的改进,包括一些缺陷修复、新特性、性能提升,也有一些不兼容的变更。

+

新特性

    +
  • 同步渲染:新增了 renderSync, parseAndRenderSync, renderFileSync API
  • +
  • 新的工具:Expression 和 Tokenizer
  • +
+

修复

    +
  • 布尔逻辑运算顺序,见 #130
  • +
  • breakcontinue 会忽略它们之前的代码,见 #123
  • +
  • React.js 示例无法正确 yarn install,见 #145
  • +
  • 有时没有正确地等待 Promise 类型的 Drops。
  • +
+

性能

    +
  • 目标平台提升到 Node.js 8 引起的性能提升(去掉了一些 Polyfill),见 #137
  • +
  • 内存使用降低了 57.5%,见 #202
  • +
  • 渲染性能提升了 100.3%,见 #205
  • +
+

不兼容的变更

    +
  • LiquidJS 不再有默认导出了,以后要使用 import {Liquid} from 'liquidjs' 语法。使用 UMD 包里的 window.Liquid 也需要改为 window.liquidjs.Liquid
  • +
  • 移除了重复的静态方法 Liquid.evalValue,统一使用示例方法 liquid.evalValue
  • +
  • 支持的最低目标平台为 Node.js 8,CJS 包(Node.js 下的主入口)不再支持 Node.js ≤ 6 了,ESM(dist/liquid.browser.esm.js)和 UMD(dist/liquid.browser.umd.js, dist/liquid.browser.min.js)包不受影响。
  • +
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/operators.html b/zh-cn/tutorials/operators.html new file mode 100644 index 000000000..5cced172b --- /dev/null +++ b/zh-cn/tutorials/operators.html @@ -0,0 +1,187 @@ + + + + + 运算符 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

运算符

+ + + +
+
+

LiquidJS 运算符非常简单也很特别,只支持两类运算符:

+
    +
  • 比较运算符:==, !=, >, <, >=, <=
  • +
  • 逻辑运算符:or, and, contains
  • +
+

因此普通的数学运算是不支持的,比如 {{a + b}}。它的替代方案是过滤器 {{ a | plus: b}}。事实上 + 在 LiquidJS 中是一个合法的变量名。

+

优先级

    +
  1. 比较运算符。所有比较运算符具有同样的优先级,且高于逻辑运算符。
  2. +
  3. 逻辑运算符。所有逻辑运算符具有同样的有衔接。
  4. +
+

结合性

逻辑运算符是又结合的,所以连续的逻辑运算时计算顺序是从右向左,参考 Shopify 的文档。

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/options.html b/zh-cn/tutorials/options.html new file mode 100644 index 000000000..bcddfce4e --- /dev/null +++ b/zh-cn/tutorials/options.html @@ -0,0 +1,213 @@ + + + + + 选项 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

选项

+ + + +
+
+

Liquid 构造函数接受一个参数对象,用来定义各种模板引擎行为。这些参数都是可选的,比如我可以指定其中一个参数 cache

+
const { Liquid } = require('liquidjs')
const engine = new Liquid({
cache: true
})
+ +
API 文档

下面的所有选项的概述,希望了解具体的类型和签名,请前往 LiquidOptions | API.

+
+ +

cache

cache 用来指定是否缓存曾经读取和处理过的模板来提升性能。在生产环境模板会重复渲染的情况会很有用。

+

默认是 false,当设置为 true 时会启用一个大小为 1024 的 LRU 缓存。当然也可以传一个数字来指定缓存大小。此外还可以是一个自定义的缓存实现,LiquidJS 会通过它来查找和读写文件。详情请参考 Caching

+

dynamicPartials

dynamicPartials 表示是否把传给 include, render, layout 标签的文件名当做变量处理。默认为 true。例如用上下文 { file: 'foo.html' } 渲染下面的模板将会引入文件 foo.html

+
{% include file %}
+ +

设置 dynamicPartials: false 后 LiquidJS 将会尝试去读取 file。当你的模板之间都是静态引入关系时会很有用:

+
{% liquid foo.html %}
+ +
Common Pitfall

LiquidJS 把这个选项默认值设为 true 以兼容于 shopify/liquid,但如果你在使用 eleventy 它会设置默认值 false (参考 Quoted Include Paths)以兼容于 Jekyll。

+
+ +

extname

extname 定义了默认的文件后缀,当传入文件名不包含后缀时自动追加。默认值是 '' 也就是说默认是禁用的。如果设置为 .liquid

+
{% render "foo" %}  没有后缀,添加 ".liquid" 并加载 foo.liquid
{% render "foo.html" %} 已经有后缀了,直接加载 foo.html
+ +
旧版行为

在 2.0.1 之前,extname 默认值为 .liquid。要禁用它需要明确设置为 extname: ''。详情参考 #41

+
+ +

root

root 用来指定 LiquidJS 查找和读取模板的根目录。可以是单个字符串,也可以是一个数组 LiquidJS 会顺序查找。详情请参考 Render Files

+

fs

fs 用来自定义文件系统实现,详情请参考 Abstract File System

+

globals

globals 用来定义对所有模板可见的全局变量。包括 render tag 引入的子模板,见 3185

+

jsTruthy

jsTruthy 用来使用 Javascript 的真值判断,默认为 false 使用 Shopify 方式。

+

例如,空字符串在 JavaScript 中为假(jsTruthytrue 时),在 Shopify 真值表中为真。

+

换行和缩进

greedy, trimOutputLeft, trimOutputRight, trimTagLeft, trimTagRight 选项用来移除 Liquid 语法周围的换行和缩进,详情请参考 Whitespace Control

+

自定义分隔符

outputDelimiterLeft, outputDelimiterRight, tagDelimiterLeft, tagDelimiterRight 用来自定义 LiquidJS 中 标签和过滤器 的分隔符。例如设置了 outputDelimiterLeft: <%=, outputDelimiterRight: %> 后我们可以避免跟其他模板引擎冲突:

+
<%= username | append: ", welcome to LiquidJS!" %>
+ +

严格模式

strictFilters 用来启用过滤器的严格模式,如果设置为 true 过滤器不存在时解析会抛出异常。默认为 false,这时会跳过不存在的过滤器。

+

strictVariables 用来启用变量严格模式。如果设置为 true 变量不存在时渲染会抛出异常,默认为 false 这时不存在的变量会被渲染为空字符串。

+
不存在的标签

不存在的标签总是会抛出一个解析异常,这一行为无法自定义。

+
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/partials-and-layouts.html b/zh-cn/tutorials/partials-and-layouts.html new file mode 100644 index 000000000..555449f7a --- /dev/null +++ b/zh-cn/tutorials/partials-and-layouts.html @@ -0,0 +1,195 @@ + + + + + 引用和继承 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

引用和继承

+ + + +
+
+

引用模板片段

对于如下两个模板文件:

+
// 文件:color.liquid
color: '{{ color }}' shape: '{{ shape }}'

// 文件:theme.liquid
{% assign shape = 'circle' %}
{% include 'color' %}
{% include 'color' with 'red' %}
{% include 'color', color: 'yellow', shape: 'square' %}
+ +

输出为:

+
color: '' shape: 'circle'
color: 'red' shape: 'circle'
color: 'yellow' shape: 'square'
+ +
".liquid" 文件扩展名

如果设置了 extname: ".liquid" 选项,就可以省略 layout, renderinclude 里面文件名的 “.liquid” 后缀。详情请参考 extname 选项

+
+ +

布局模板(模板继承)

对于如下两个模板文件:

+
// 文件:default-layout.liquid
Header
{% block content %}My default content{% endblock %}
Footer

// 文件:page.liquid
{% layout "default-layout" %}
{% block content %}My page content{% endblock %}
+ +

渲染 page.liquid 将会输出:

+
Header
My page content
Footer
+ +
Block
    +
  • 布局文件(父模板)中可以定义多个 block;
  • +
  • 只有一个 block 时,block 名字可以省略。
  • +
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/plugins.html b/zh-cn/tutorials/plugins.html new file mode 100644 index 000000000..20d6383dc --- /dev/null +++ b/zh-cn/tutorials/plugins.html @@ -0,0 +1,192 @@ + + + + + 插件 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

插件

+ + + +
+
+

一组标签和过滤器可以封装为一个 插件,通常发包到 NPM 来方便使用。本文介绍如何创建和使用插件。

+

编写插件

LiquidJS 插件就是一个简单的函数,它的第一个参数是 Liquid 类,其中的 this 是它被注册到的 Liquid 实例。可以通过 this 来调用 Liquid API,比如 注册标签和过滤器

+

现在我们来写一个插件并在其中注册一个过滤器,来把输入字符串转换为大写:

+
/**
* Inside the plugin function, `this` refers to the Liquid instance.
*
* @param Liquid: provides facilities to implement tags and filters.
*/
module.exports = function (Liquid) {
this.registerFilter('upup', x => x.toUpperCase());
}
+ +

把上述代码保存为 upup.js

+

使用插件

把插件传递给 .plugin() 方法即可注册插件,例如:

+
const engine = new Liquid()

engine.plugin(require('./upup.js'));
engine.parseAndRender('{{ "foo" | upup }}').then(console.log)
+ +

上述代码将会输出 "FOO"

+

插件列表

由于本仓库只包含 Shopify/liquid 核心仓库的标签和插件(参考 https://github.com/harttle/liquidjs#differences-and-limitations),Shopify 平台上特有的插件只能通过插件来使用。

+

这里是一个插件列表,欢迎添加你的插件(点击右上角编辑按钮):

+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/register-filters-tags.html b/zh-cn/tutorials/register-filters-tags.html new file mode 100644 index 000000000..321bda3be --- /dev/null +++ b/zh-cn/tutorials/register-filters-tags.html @@ -0,0 +1,191 @@ + + + + + 注册标签和过滤器 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

注册标签和过滤器

+ + + +
+
+

注册标签

// 使用方式: {% upper name %}
engine.registerTag('upper', {
parse: function(tagToken, remainTokens) {
this.str = tagToken.args; // name
},
render: async function(scope, hash) {
var str = await this.liquid.evalValue(this.str, scope); // 'alice'
return str.toUpperCase() // 'Alice'
}
});
+ +
    +
  • parse: 从 remainTokens 中读取后续的标签/输出/HTML,直到找到你期望的结束标签。
  • +
  • render: 把 scope 数据和此前解析得到的 Token 结合,输出 HTML 字符串。
  • +
+

查看已有的标签实现:https://github.com/harttle/liquidjs/tree/master/src/builtin/tags

+

注册过滤器

// 使用方式: {{ name | upper }}
engine.registerFilter('upper', v => v.toUpperCase())
+ +

过滤器的参数将会传递给上面注册的过滤器函数,从第二个参数开始(第一个参数是过滤器左侧的输入),例如:

+
// Usage: {{ 1 | add: 2, 3 }}
engine.registerFilter('add', (initial, arg1, arg2) => initial + arg1 + arg2)
+ +

查看已有的过滤器实现:https://github.com/harttle/liquidjs/tree/master/src/builtin/filters

+

反注册标签/过滤器

有时可能需要禁用一些标签/过滤器(比如 #324),注册一个假的标签/过滤器并在里面抛出相应的错误即可。

+
// 禁用标签
const disabledTag = {
parse: function(token) {
throw new Error(`tag "${token.name}" disabled`);
}
}
engine.registerTag('include', disabledTag);

// 禁用过滤器
function disabledFilter(name) {
return function () {
throw new Error(`filter "${name}" disabled`);
}
}
engine.registerFilter('plus', disabledFilter('plus'));
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/render-file.html b/zh-cn/tutorials/render-file.html new file mode 100644 index 000000000..523a79f72 --- /dev/null +++ b/zh-cn/tutorials/render-file.html @@ -0,0 +1,217 @@ + + + + + 渲染文件 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

渲染文件

+ + + +
+
+

一个典型的项目会有一个目录下都是模板,最方便的方式就是设置 LiquidJS 的 root 然后调用 .renderFile().renderFileSync() 来渲染其中的一个模板文件。

+

渲染一个文件

例如你有如下的目录结构:

+
.
├── index.js
└── views/
├── hello.liquid
└── world.liquid
+ +

其中 hello.liquid 内容为:

+
name: {{name}}
+ +

index.js 中可以这样渲染 hello.liquid:

+
var engine = new Liquid({
root: path.resolve(__dirname, 'views/'), // 设置模板查找目录
extname: '.liquid' // 添加后缀,默认为 "" 表示不添加后缀
});
// 将会读取并渲染 `views/hello.liquid`
engine.renderFile("hello", {name: 'alice'}).then(console.log)
+ +

执行 node index.js 你将会得到类似这样的输出:

+
name: alice
+ +

模板查找

传递给 .renderFile(), .parseFile() .renderFileSync(), .parseFileSync() 这些 API 的模板名,
以及传递给 include, layout 这些标签的模板名,将会根据 root 选项来查找。

+

root 可以设置为 string 类型的路径(见上面的例子), 也可以设置为一个字符串数组表示路径列表,这时 LiquidJS 将会按顺序去查找。例如:

+
var engine = new Liquid({
root: ['views/', 'views/partials/'],
extname: '.liquid'
});
+ +
相对路径

root 中使用相对路径将会被解释为相对于 cwd()(当前工作目录)。

+
+ +当模板中引入子模板时(`{% render "foo" %}`),或者调用 `.renderFile('foo')` 时,LiquidJS 会依次查看如下几个文件,并渲染第一个存在的文件: + +- `cwd()`/views/foo.liquid +- `cwd()`/views/partials/foo.liquid + +如果上述文件都不存在,将会抛出一个 `ENOENT` 错误。 + +
示例

在 Node.js 示例中展示了怎么渲染一个文件 liquidjs/demo/nodejs/

+
+ +

在浏览器中使用 LiquidJS 时,比如当前路径为 https://example.com/bar/index.html,只会去 root 数组中的第一个路径下获取,也就是这个文件:

+ +

如果获取失败(比如得到一个 404/500 错误)或网络错误,将会抛出一个 ENOENT 错误。

+
示例

在这个示例中展示了如何从网络获取并渲染一个模板文件 liquidjs/demo/browser/

+
+ +

文件系统接口

LiquidJS 定义了一个文件系统接口(src/fs/ifs.ts),在 Node.js 下的默认实现是 src/fs/node.ts,在浏览器打包文件中的默认实现是 src/fs/browser.ts
你可以通过创建 Liquid 时的 fs 参数来指定一个自定义实现来指定如何读取模板文件。比如从数据库里读取:

+
const engine = new Liquid({
fs: {
readFileSync (file) {
return db.model('Template').findByIdSync(file).text
},
await readFile (file) {
const template = await db.model('Template').findById(file)
return template.text
},
existsSync () {
return true
},
await exists () {
return true
},
resolve(root, file, ext) {
return file
}
}
});
+ + +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/setup.html b/zh-cn/tutorials/setup.html new file mode 100644 index 000000000..c6c91fe7e --- /dev/null +++ b/zh-cn/tutorials/setup.html @@ -0,0 +1,208 @@ + + + + + 安装和使用 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

安装和使用

+ + + +
+
+

如果你还不了解 Liquid 模板语言,请参考 Liquid 模板语言简介

+

在 Node.js 里使用

通过 NPM 安装:

+
npm install --save liquidjs
+ +
var { Liquid } = require('liquidjs');
var engine = new Liquid();

engine
.parseAndRender('{{name | capitalize}}', {name: 'alice'})
.then(console.log); // 输出 'Alice'
+ +
示例

这里有一个 LiquidJS 在 Node.js 里使用的例子:liquidjs/demo/nodejs/.

+
+ +LiquidJS 的类型定义也导出并发布到了 NPM 包里,写 TypeScript 的项目可以直接这样使用: + +
import { Liquid } from 'liquidjs';
const engine = new Liquid();

engine
.parseAndRender('{{name | capitalize}}', {name: 'alice'})
.then(console.log); // 输出 'Alice'
+ +
示例

这里有一个 LiquidJS 在 TypeScript 下的例子:liquidjs/demo/typescript/.

+
+ +

在浏览器里使用

LiquidJS 预先构建了 UMD Bundle,可以通过 jsDelivr CDN 来引用:

+
<script src="https://cdn.jsdelivr.net/npm/liquidjs/dist/liquid.browser.min.js"></script>     <!--生产环境-->
<script src="https://cdn.jsdelivr.net/npm/liquidjs/dist/liquid.browser.umd.js"></script> <!--开发环境-->
+ +
示例

这里有一个 jsFiddle 上的在线例子:jsfiddle.net/x43eb0z6,其源码也可以在 liquidjs/demo/browser/ 找到。

+
+ +
兼容性

在类似 IE 和 Android UC 这样的浏览器中,你可能需要引入 Promise polyfill,参看 caniuse 的统计

+
+ +

在命令行里使用

你还可以在命令行里使用 LiquidJS:

+
echo '{{"hello" | capitalize}}' | npx liquidjs
+ +

模板来自标准输入,数据则来自参数,这个参数可以是一个 JSON 文件的路径,也可以是一个 JSON 字符串:

+
echo 'Hello, {{ name }}.' | npx liquidjs '{"name": "Snake"}'
+ +

其他

@stevenanthonyrevo 还提供了一个 ReactJS demo,请参考 liquidjs/demo/reactjs/

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/truthy-and-falsy.html b/zh-cn/tutorials/truthy-and-falsy.html new file mode 100644 index 000000000..104ad06a6 --- /dev/null +++ b/zh-cn/tutorials/truthy-and-falsy.html @@ -0,0 +1,307 @@ + + + + + 真和假 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

真和假

+ + + +
+
+

虽然我们希望 Liquid 是平台无关的,但 JavaScript 版本和 Ruby 版本 仍然有很多区别,真值就是其中之一。

+

真值表

根据 Shopify 的文档,Ruby 版本除了 falsenil 之外的所有值都是真,但 JavaScript 有完全不同的类型系统,比如我们有 undefined 类型,以及不区分 integerfloat,因此有些不同:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
true✔️
false✔️
null✔️
undefined✔️
string✔️
empty string✔️
0✔️
integer✔️
float✔️
array✔️
empty array✔️
+

使用 JavaScript 真值

liquidjs 默认使用 Shopify 的真值表,但可以通过设置 jsTruthy 选项为 true 来使用标准的 JavaScript 真值。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
true✔️
false✔️
null✔️
undefined✔️
string✔️
empty string✔️
0✔️
integer✔️
float✔️
array✔️
empty array✔️
+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/use-in-expressjs.html b/zh-cn/tutorials/use-in-expressjs.html new file mode 100644 index 000000000..721caf45c --- /dev/null +++ b/zh-cn/tutorials/use-in-expressjs.html @@ -0,0 +1,195 @@ + + + + + 在 Express.js 里使用 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

在 Express.js 里使用

+ + + +
+
+

LiquidJS 可以用来作为 Express 的模板引擎。可以把 Liquid 设置到 view engine 选项上即可:

+
var { Liquid } = require('liquidjs');
var engine = new Liquid();

// 注册为 liquid 文件的模板引擎
app.engine('liquid', engine.express());
app.set('views', './views'); // 指定模板目录
app.set('view engine', 'liquid'); // 把 liquid 文件设为默认模板
+ +
示例

这是一个在 Express.js 中使用 LiquidJS 的例子:liquidjs/demo/express/.

+
+ +

模板查找

LiquidJS 仍然会去 root 指定的目录查找(参考 Render A Template File),也会去 Express.js 的 views 选项指定的目录里(上述例子中是 ./views)去查找。例如你有这样的目录结构:

+
.
├── views1/
│ └── hello.liquid
└── views2/
└── world.liquid
+ +

LiquidJS 的模板 root 设置到了 views1,Express.js 的 views 设置到了 views2

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
root: './views1/'
});

app.engine('liquid', engine.express());
app.set('views', './views2');
app.set('view engine', 'liquid');
+ +

hello.liquidworld.liquid 两个文件都可以找到并且成功渲染:

+
res.render('hello')
res.render('world')
+ +

缓存

直接把 cache 选项 设为 true 即可开启模板缓存,参考 缓存 一文。推荐在生产环境中开启缓存,可以用如下代码:

+
var { Liquid } = require('liquidjs');
var engine = new Liquid({
cache: process.env.NODE_ENV === 'production'
});
+ +

cache 还可以是一个数字表示最大缓存的模板数量,也可以是一个自定义的缓存实现,详情请参考 cache 选项

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/zh-cn/tutorials/whitespace-control.html b/zh-cn/tutorials/whitespace-control.html new file mode 100644 index 000000000..b54bb5f3d --- /dev/null +++ b/zh-cn/tutorials/whitespace-control.html @@ -0,0 +1,199 @@ + + + + + 空白字符控制 | LiquidJS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+
+
+
+

空白字符控制

+ + + +
+
+

为了让源代码缩进好看,我们会加很多空白字符比如把不会产生输出的标签也单独一行。LiquidJS 提供了空白字符控制机制,可以避免这些多余的空白字符输出到 HTML 中。

+

通过标记的方式

默认所有标签和输出的行,都会在行尾产生一个换行(\n),如果有缩进的话还会产生很多前导空格。例如:

+
{%  author = "harttle" %}
{{ author }}
+ +

将会输出(注意前面的空行):

+

harttle
+ +

可以在标签和输出的标记里面加横线({{-, -}}, {%-, -%})来移除左侧/右侧的空白。例如:

+
{% assign author = "harttle" -%}
{{ author }}
+ +

将会输出:

+
harttle
+ +

这个例子中 -%} 移除了 assign 标签右侧的空白。

+

通过选项

此外 LiquidJS 还提供了一系列选项来帮助扫代码式地移除空白:

+
    +
  • trimTagLeft
  • +
  • trimTagRight
  • +
  • trimValueRight
  • +
  • trimValueRight
  • +
+

LiquidJS 默认 不会 移除任何空白字符,也就是说上面几个选项的默认值都为 false。这几个选项的详情请参考 LiquidJS 选项

+

贪婪模式

上述几个设置默认情况下会跨越换行(\n),如果你希望保留上下空行可以把 greedy 选项 关掉,这样遇到 \n 就会停止。为了和 shopify/liquid 一致该选项默认是打开的。

+ +
+ +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + \ No newline at end of file