Compare commits

..

840 Commits

Author SHA1 Message Date
Mbarak Bujra
efec04af06 add a test clearly showing and commiting to the order of and/or operations 2021-04-05 20:55:10 +00:00
Dylan Thacker-Smith
eab13a07d9 Add changelog entry for a recent fix 2021-03-29 13:43:01 -07:00
Dylan Thacker-Smith
ca96ca0fef Fix support for using a String subclass for the liquid source (#1421) 2021-03-29 16:22:05 -04:00
Marc-André Cournoyer
4e7a953e73 Merge pull request #1417 from Shopify/prep-release
Bump to 5.0.1 and add changelog for release
2021-03-24 16:55:10 -04:00
Marc-André Cournoyer
6ac2499f7f Remove internal tokenizer fix from History.md
Co-authored-by: Dylan Thacker-Smith <dylan.smith@shopify.com>
2021-03-24 16:53:45 -04:00
Marc-André Cournoyer
ff70161512 Remove internal fixes from History.md
Co-authored-by: Dylan Thacker-Smith <dylan.smith@shopify.com>
2021-03-24 16:52:57 -04:00
Marc-André Cournoyer
026157e128 Bump to 5.0.1 and add changelog for release 2021-03-24 16:19:19 -04:00
Charles-Philippe Clermont
bf64239ea6 Merge pull request #1414 from Shopify/fix/echo-parse-tree-visitor
Add ParseTreeVisitor to Echo tag
2021-03-24 09:38:48 -04:00
Charles-P. Clermont
c270a6f378 Add ParseTreeVisitor to Echo tag
This fixes theme-check#218, wherein variables used in echo tags are not
considered used by the linter. It is because our visitor doesn't see the
:variable_lookup's in the echo tag since the children array is empty.
But this array is empty because it is swallowed by the @variable.
2021-03-24 09:35:43 -04:00
Dylan Thacker-Smith
4fba61a802 Merge pull request #1402 from Shopify/rubocop-shopify
Use the rubocop-shopify gem and autocorrect
2021-03-16 17:39:09 -04:00
Dylan Thacker-Smith
6b6baece25 Merge pull request #1406 from ADTC/patch-2
Add a line to Sign the CLA as the first step in Workflow
2021-02-26 09:03:40 -05:00
ADTC
15b2d193ec Add a hint to sign CLA only if it's the first time
The CLA isn't signed per repository. They might have done so for another repository. In which case, they won't need to do that again.

Change attributed to @dylanahsmith

Co-authored-by: Dylan Thacker-Smith <dylan.smith@shopify.com>
2021-02-26 16:31:16 +08:00
ADTC
fd712d134a Give info in the Contributing page about doc updates (#1405)
Please see #1399 for more info and discussion.
2021-02-25 09:31:18 -05:00
ADTC
0c2db998cf Add a line to Sign the CLA as the first step in Workflow
If a pull request is created by someone who didn't sign the CLA yet, the tests will fail. It requires the contributor to submit a new PR or add an insignificant commit (like an empty commit) to force the tests to rerun on the same PR. If we gently nudge a new contributor to sign the CLA in advance, we can help them avoid the hassle.
2021-02-25 09:59:51 +08:00
Dylan Thacker-Smith
9dac68cce1 Use the rubocop-shopify gem 2021-02-21 12:22:03 -05:00
Dylan Thacker-Smith
c50509b741 Commit rubocop remote configuration update 2021-02-21 12:02:55 -05:00
Dylan Thacker-Smith
cd66572514 Rubocop autocorrections to prepare for rubocop config updates 2021-02-21 12:01:59 -05:00
Dylan Thacker-Smith
dcb5a67089 performance: Use split limit in truncatewords (#1361) 2021-02-19 13:11:35 -05:00
Justin Li
efe44a7e6a Merge pull request #1391 from Unending/replace_carriage_return
handle carriage return in newlines_to_br
2021-02-19 12:49:13 -05:00
Dylan Thacker-Smith
8625e66453 CI: Test with ruby 3.0 as the latest ruby version (#1398) 2021-02-10 10:10:27 -05:00
Unending
3cae09b968 handle carriage return in newlines_to_br 2021-01-16 18:49:01 +01:00
Peter Zhu
3c499d0241 Merge pull request #1387 from Shopify/pz-serialize-benchmark-refactor
Refactor render_layout method for serialization
2021-01-11 15:51:00 -05:00
Peter Zhu
e71e53ffb5 Refactor render_layout method for serialization 2021-01-11 14:00:39 -05:00
Dylan Thacker-Smith
260c863e23 Build the tokenizer through the parse context for liquid-c (#1386) 2021-01-07 14:51:41 -05:00
Marc-André Cournoyer
42b6c07cd0 Merge pull request #1384 from Shopify/allowed_push_host
Add allowed_push_host to gemspec
2021-01-06 10:18:16 -05:00
Marc-André Cournoyer
c91a6827f2 Add allowed_push_host to gemspec
Required to push gem to rubygems.
2021-01-06 10:03:13 -05:00
Marc-André Cournoyer
5dbc3d5701 Merge pull request #1383 from Shopify/bump-version
Bump version to 5.0.0
2021-01-06 09:38:04 -05:00
Marc-André Cournoyer
22683cbd2a Bump version to 5.0.0
Bump major because of the numerous breaking changes.
2021-01-05 15:02:14 -05:00
Peter Zhu
abfab3bef2 Merge pull request #1380 from Shopify/pz-serialize-compat
Fixes for serialization
2021-01-05 14:10:54 -05:00
Peter Zhu
51e8d6234a Freeze blocks in reverse order 2020-12-16 15:18:34 -05:00
Peter Zhu
7ca2846d9c Move configure options to a method 2020-12-16 15:08:55 -05:00
Dylan Thacker-Smith
7ba0fc7952 Merge pull request #1376 from Shopify/support-app-liquid-context
Use the same context class for isolated subcontexts for the require tag
2020-12-14 12:12:46 -05:00
Marc-André Cournoyer
e2c86d137f Merge pull request #1377 from Shopify/update-history
Fix latest changelog
2020-12-13 12:27:15 -05:00
Marc-André Cournoyer
776a63b61d Update latest changelog to mention Ruby 2.5 req 2020-12-13 12:13:49 -05:00
Marc-André Cournoyer
84f9d6957c Merge pull request #1374 from Shopify/update-history
Update History.md with changes since last release
2020-12-11 17:05:33 -05:00
Marc-André Cournoyer
7d32728e16 Split latest changelog in Features, Fixes, Changes & Perf
Also remove duplicated entries
2020-12-11 16:35:19 -05:00
Dylan Thacker-Smith
40a9b72b3c Allow a block to finish context init before squashing instance assigns
Liquid::Context#squash_instance_assigns_with_environments can result in
Proc objects in the environment to be eagerly evaluated. So it should be
possible to finish initializing the context object before this is done.
Allowing a block to be used for this purpose avoids the need to add
additional parameters for this purpose.
2020-12-11 14:52:09 -05:00
Dylan Thacker-Smith
4ff26cd707 Use the same context class for isolated subcontexts for the require tag 2020-12-11 14:52:09 -05:00
Dylan Thacker-Smith
462919a28f Merge pull request #1375 from Shopify/update-rubocop
Update rubocop and related configuration
2020-12-11 14:47:56 -05:00
Dylan Thacker-Smith
f3e2be9f85 Update rubocop 2020-12-11 14:14:15 -05:00
Dylan Thacker-Smith
4d40f83457 Update .rubocop_todo.yml to ignore Lint/MissingSuper offenses in drops
I don't think we can rely on the application to call `super` in their
drop's initializers at the moment, so doing that consistently in liquid
would prevent this from being properly tested.
2020-12-11 14:14:15 -05:00
Dylan Thacker-Smith
00be1e4dd4 Update inherited rubocop shopify style guide configuration 2020-12-11 14:14:15 -05:00
Dylan Thacker-Smith
f7d67b946e rubocop autocorrect Style/MethodCallWithArgsParentheses 2020-12-11 13:51:00 -05:00
Marc-André Cournoyer
ae9aee896b Update History.md with changes since last release 2020-12-10 08:03:17 -05:00
Dylan Thacker-Smith
6dec172743 Merge pull request #1366 from Shopify/profile-render-node
Create top-level profile timing nodes for multiple template renders
2020-12-09 10:07:31 -05:00
Dylan Thacker-Smith
da581d988a Create top-level profile timing nodes for multiple template renders 2020-12-09 10:06:02 -05:00
Dylan Thacker-Smith
7960826552 Rename render_profiling_test.rb to profiler_test.rb
so it corresponds to the class name being tested
2020-12-09 10:06:02 -05:00
Dylan Thacker-Smith
84059691b8 Merge pull request #1365 from Shopify/profiling-multiple-renders
Support using a profiler for multiple renders
2020-12-09 10:05:48 -05:00
Dylan Thacker-Smith
896288eff1 Move start of profiling to a Document#render_to_output_buffer patch 2020-12-09 10:04:34 -05:00
Dylan Thacker-Smith
b3f132efd1 Fix total_render_time if a Profiler gets used for multiple renders 2020-12-09 10:04:34 -05:00
Dylan Thacker-Smith
60214b957c Store the profiler in the context instead of a thread-local variable (#1364) 2020-12-09 10:04:20 -05:00
Dylan Thacker-Smith
7361220af6 Merge pull request #1363 from Shopify/profiler-context-template-name
Fix template name in profile result for render tag timing objects
2020-12-09 10:03:42 -05:00
Dylan Thacker-Smith
cb2ad71a31 Remove the Profiler#initialize argument which is effectively now unused
The @root_timing Timing object that it was used with never exposed that
name.
2020-12-09 10:01:16 -05:00
Dylan Thacker-Smith
900e3a6491 Fix template name in profile result for render tag timing objects 2020-12-09 10:01:16 -05:00
Dylan Thacker-Smith
f18084203d Use monotonic time to measure durations in Liquid::Profiler (#1362) 2020-12-09 10:00:44 -05:00
Peter Zhu
3358a892f2 Merge pull request #1371 from Shopify/pz-revert-instrument
Revert instrumentation of end_tag_params and range_float
2020-12-01 15:24:52 -05:00
Peter Zhu
bbfcaa2cc0 Revert "Merge pull request #1350 from Shopify/pz-instrument-invalid-end-tag"
This reverts commit e6eef4b2c4, reversing
changes made to c7c21e88f0.
2020-12-01 14:38:04 -05:00
Peter Zhu
ba657871bc Revert "Merge pull request #1359 from Shopify/pz-instrument-range-floats"
This reverts commit 300adfd7ae, reversing
changes made to ed0aebcbc9.
2020-12-01 14:37:23 -05:00
Peter Zhu
29d5d9674a Merge pull request #1370 from Shopify/pz-freeze-case-body
Freeze the body for case tags
2020-11-27 12:03:03 -05:00
Peter Zhu
0a645e72c1 Freeze the body for case 2020-11-27 11:29:17 -05:00
Dylan Thacker-Smith
1850511334 Use an atomic subgroup in range regex to avoid pathological backtracking (#1360) 2020-11-16 10:29:36 -05:00
Peter Zhu
300adfd7ae Merge pull request #1359 from Shopify/pz-instrument-range-floats
Instrument usage of floats in ranges
2020-11-13 16:08:47 -05:00
Peter Zhu
f357662f37 Instrument floats in ranges 2020-11-13 16:05:29 -05:00
Peter Zhu
ed0aebcbc9 Merge pull request #1355 from Shopify/pz-instrument-forloop-name
Instrument forloop.name
2020-11-12 14:24:08 -05:00
Peter Zhu
ea4f1885f8 Instrument forloop.name 2020-11-12 14:19:12 -05:00
Peter Zhu
2f75db604f Merge pull request #1354 from Shopify/pz-instrument-for-offset-continue
Instrument usage of offset:continue in for loops
2020-11-12 14:14:09 -05:00
Peter Zhu
d844a3dd8b Instrument usage of offset:continue in for loops 2020-11-12 13:39:02 -05:00
Max Melentiev
9fcba1a26c Remove unused translation (#1033) 2020-11-11 10:21:04 -05:00
Peter Zhu
0659891e68 Merge pull request #1352 from Shopify/pz-test-trim-blank
Test trim without any content
2020-11-10 10:36:21 -05:00
Peter Zhu
e7fb3b18f3 Test trim without any content 2020-11-10 10:31:07 -05:00
Peter Zhu
e6eef4b2c4 Merge pull request #1350 from Shopify/pz-instrument-invalid-end-tag
Instrument invalid end tags
2020-11-10 10:06:25 -05:00
Peter Zhu
2ce577e36b Instrument for bug #1346 2020-11-09 14:27:17 -05:00
Peter Zhu
c7c21e88f0 Merge pull request #1344 from Shopify/pz-test-space-in-dot
Test space between dot for attributes
2020-11-06 10:10:08 -05:00
Peter Zhu
a89371b0b9 Test space between dot 2020-11-05 15:39:44 -05:00
Dylan Thacker-Smith
8f7f8761d1 Use Array#each instead of Array#inject to avoid an object allocation (#1341) 2020-10-29 11:24:19 -04:00
Justin Li
a3ff300419 Merge pull request #1330 from ashmaroli/exception-renderer-lambda
Stash exception_renderer lambda in a constant
2020-10-28 13:38:20 -04:00
Dylan Thacker-Smith
ea6e326b9c Fix FrozenError for blank case tag with multiple expression when tag (#1340) 2020-10-28 13:37:17 -04:00
Ashwin Maroli
740f8759cc Rename constant to RAISE_EXCEPTION_LAMBDA 2020-10-28 23:06:13 +05:30
Ashwin Maroli
bb9cd4eb6a Merge upstream branch 'master' into this branch 2020-10-28 22:14:09 +05:30
Peter Zhu
3a591fbf26 Merge pull request #1336 from ashmaroli/trigger-github-actions-on-pull-requests
Run workflows for pull requests from repo forks
2020-10-28 11:35:52 -04:00
Dylan Thacker-Smith
7754d5aef5 Attempt to strict parse variables before lax parsing in lax error mode (#1338) 2020-10-28 10:37:00 -04:00
Dylan Thacker-Smith
1d63d5db5f Fix a leaky test that set Tempate.error_mode without resetting it (#1339) 2020-10-28 10:36:33 -04:00
Ashwin Maroli
26640368e5 Run workflows for pull requests from repo forks 2020-10-28 12:45:10 +05:30
Dylan Thacker-Smith
f23c2a83f2 Fix lax parsing expressions surrounded by spaces (#1335)
to make it compatible with strict parsing and liquid-c
2020-10-27 14:53:57 -04:00
Peter Zhu
61d54d1b19 Merge pull request #1331 from Shopify/pz-freeze-block
Freeze block body after parsing completes
2020-10-27 13:17:54 -04:00
Dylan Thacker-Smith
10ea6144e0 Add Liquid::ParseContext#parse_expression for liquid-c node disabling (#1333)
We would like to be able to disable liquid-c VM rendering at runtime,
but right now expression parsing is done using Expression.parse, which
isn't aware of the parse context.  That prevents us from conditionally
compiling to VM code based on a parse option.
2020-10-27 11:00:04 -04:00
Peter Zhu
292d971937 Merge loops 2020-10-27 10:42:30 -04:00
Peter Zhu
5c082472a1 Address comments 2020-10-26 16:16:30 -04:00
Peter Zhu
0bedc71854 Address comments 2020-10-26 15:11:00 -04:00
Peter Zhu
fe66edb825 Freeze block body after parsing completes 2020-10-26 11:06:55 -04:00
Ashwin Maroli
bfa2df7036 Stash exception_renderer lambda in a constant 2020-10-26 19:44:00 +05:30
Ashwin Maroli
0e52706a5b Remove redundant comment in Liquid::Template (#1328) 2020-10-22 12:49:02 -04:00
Dylan Thacker-Smith
4c6166f989 Add parsing quirk test for lookup on variable with literal name (#1325) 2020-10-21 16:30:17 -04:00
Justin Li
8e99b3bd7f Merge pull request #1322 from ashmaroli/else-tag-names
Stash array of tag names in a constant
2020-10-21 12:09:14 -04:00
Dylan Thacker-Smith
f6532de1fd Merge pull request #1323 from Shopify/assign-score-hash
Avoid allocating arrays of key value pairs in assign_score_of
2020-10-21 11:18:35 -04:00
Dylan Thacker-Smith
001fde7694 Avoid allocating arrays of key value pairs for hashes in assign_score_of 2020-10-21 10:36:00 -04:00
Dylan Thacker-Smith
b872eac2b9 More comprehensively test assign_score_of 2020-10-21 10:35:56 -04:00
Dylan Thacker-Smith
038d0585cf Move some assign score increment tests to the tag that increments 2020-10-21 10:21:00 -04:00
Ashwin Maroli
b15428ea83 Stash array of tag names in a constant 2020-10-21 18:50:56 +05:30
Dylan Thacker-Smith
c9ad9d338c Extract method for raising a syntax error in the assign tag for liquid-c (#1321) 2020-10-20 16:59:52 -04:00
Dylan Thacker-Smith
ae6bd9f6b0 Allow an empty variable tag during strict parsing for liquid-c compat (#1320) 2020-10-20 14:11:48 -04:00
Dylan Thacker-Smith
866e437c05 Test tag disabling using custom tags (#1318)
Since I don't think we have any use case to disable the `raw` or
`echo` tags, so I would like liquid-c to not have to support that
2020-10-19 16:32:02 -04:00
Dylan Thacker-Smith
784db053f2 Merge pull request #1317 from Shopify/strict-parse-dynamic-find-var
Fix strict parsing of find variable with a name expression
2020-10-19 13:43:26 -04:00
Dylan Thacker-Smith
ff1c6bd26e Actually remove test file with no extension moved into another test file (#1316) 2020-10-19 12:40:02 -04:00
Dylan Thacker-Smith
46fd63da5f Fix strict parsing of find variable with a name expression 2020-10-19 12:17:25 -04:00
Dylan Thacker-Smith
420a1c79e1 Refactor variable lookup strict parsing to reduce coupling on dot lookup 2020-10-19 12:10:32 -04:00
Dylan Thacker-Smith
6d39050e1e Use a case statement in Liquid::Parser#expression 2020-10-19 12:10:11 -04:00
Dylan Thacker-Smith
077bf2a409 Test reporting of liquid error for filter call with wrong number of arguments (#1311) 2020-10-08 11:55:40 -04:00
Dylan Thacker-Smith
1a3e38c018 Merge pull request #1310 from Shopify/only-integration-test-liquid-c
Fix liquid-c integration testing
2020-10-08 11:52:50 -04:00
Dylan Thacker-Smith
e495f75cc2 Remove support for ruby 2.4, which is no longer supported upstream 2020-10-08 09:48:16 -04:00
Dylan Thacker-Smith
e781449c36 Remove root directory from library search path for tests
It isn't in the gemspec's require_path, so we shouldn't add any dependence
on it.
2020-10-08 01:53:11 -04:00
Dylan Thacker-Smith
7eb03ea198 Only test liquid-c integration using the integration tests 2020-10-08 01:52:40 -04:00
Peter Zhu
bd34cd5613 Merge pull request #1308 from Shopify/pz-gh-actions
Use GitHub Actions for CI
2020-10-07 14:38:15 -04:00
Peter Zhu
c28d455f7b Use GitHub Actions for CI 2020-10-07 13:29:39 -04:00
Dylan Thacker-Smith
d250a7f502 Set Context#initialize instance variables before squashing assigns (#1307) 2020-10-06 21:00:08 -04:00
Peter Zhu
b0f46326ca Merge pull request #1306 from Shopify/pz-raise-tag-never-closed
Refactor raising tag never closed error to method
2020-10-06 17:13:35 -04:00
Peter Zhu
7aed2f122c Refactor raising tag never closed to method 2020-10-06 15:55:55 -04:00
Peter Zhu
5199a34d9b Merge pull request #1304 from Shopify/pz-raw-bug
Fix duplication of text in raw tags
2020-10-05 10:59:15 -04:00
Peter Zhu
4c2ab6f878 Fix bug in raw tags 2020-10-05 10:47:28 -04:00
Dylan Thacker-Smith
a818dd9d19 Fix test with missing extension (#1302) 2020-09-30 13:44:28 -04:00
Dylan Thacker-Smith
efef03d944 Merge pull request #1294 from Shopify/changes-for-liquid-c-vm-variable
Refactor to support liquid-c VM compilation of variables
2020-09-29 21:02:26 -04:00
Dylan Thacker-Smith
33760f083a Extract rescue code from BlockBody#render_node for re-use in liquid-c 2020-09-25 11:24:39 -04:00
Dylan Thacker-Smith
013802c877 Move some unit tests without internal coupling to integration tests
since I would like to continue supporting these tests in liquid-c
in the foreseeable future.
2020-09-25 11:24:39 -04:00
Dylan Thacker-Smith
3dcad3b3cd Move test/integration/parse_tree_visitor_test.rb to test/unit
The ParseTreeVisitor exposes the liquid internals that won't be
kept compatible with liquid-c, so move it out of the integration
tests directory so that we can easily ignore it when testing liquid-c
2020-09-25 11:24:39 -04:00
Dylan Thacker-Smith
db065315ba Allow creating symbols that are garbage collected in a test 2020-09-25 11:24:39 -04:00
Dylan Thacker-Smith
a03f02789b Only use MethodLiteral in condition expressions (#1300) 2020-09-25 11:10:33 -04:00
Dylan Thacker-Smith
ca4b9b43af Port liquid-c bug compatible whitespace trimming (#1291) 2020-09-16 16:07:36 -04:00
Dylan Thacker-Smith
77084930e9 Bring back silencing of errors in blank nodes for backwards compatibility (#1292) 2020-09-15 10:35:18 -04:00
Dylan Thacker-Smith
fb77921b15 Merge pull request #1290 from Shopify/document-unknown-tag-refactor
Pass the tag markup and tokenizer to Document#unknown_tag
2020-09-11 09:34:16 -04:00
Dylan Thacker-Smith
0d02dea20b Rename Liquid::Block#unknown_tag parameters for clarity 2020-09-11 09:33:12 -04:00
Dylan Thacker-Smith
86b47ba28b Pass the tag markup and tokenizer to Document#unknown_tag
The parse_context no longer needs to be passed in because it is available
through through an attr_reader on the instance. However, the markup and
tokenizer weren't made available.  This refactor also makes the parameters
given to Document#unknown_tag consistent with Block#unknown_tag.
2020-09-11 09:33:12 -04:00
Dylan Thacker-Smith
95ff0595c6 Merge pull request #1289 from Shopify/refactor-for-c-block-body
Avoid direct coupling to BlockBody instances for liquid-c replacement
2020-09-11 09:15:58 -04:00
Dylan Thacker-Smith
bbc56f35ec Add ParseContext#new_block_body to centralize the liquid-c override point 2020-09-09 12:25:35 -04:00
Dylan Thacker-Smith
dfbbf87ba9 Use BlockBody from Document using composition rather than inheritence
This way liquid-c can more cleanly use a Liquid::C::BlockBody object
for the block body by overriding Liquid::Document#new_body.
2020-09-08 14:00:52 -04:00
Dylan Thacker-Smith
037b603603 Turn some Liquid::BlockBody methods into class methods for liquid-c
So they can be used from a Liquid::C::BlockBody
2020-09-08 14:00:48 -04:00
Dylan Thacker-Smith
bd33df09de Provide Block#new_body so that liquid-c can override it
This way liquid-c can return a body of a different class that wraps
a C implementation.
2020-09-08 13:59:48 -04:00
Dylan Thacker-Smith
6ca5b62112 Merge pull request #1285 from Shopify/fix-render-length-resource-limit
Fix render length resource limit so it doesn't multiply nested output
2020-09-08 13:57:30 -04:00
Dylan Thacker-Smith
e1a2057a1b Update assign_score during capturing
To stop long captures before they grow the heap more then they should.
2020-09-03 11:13:08 -04:00
Dylan Thacker-Smith
ae9dbe0ca7 Fix render length resource limit so it doesn't multiply nested output 2020-09-03 11:13:04 -04:00
Dylan Thacker-Smith
3b486425b0 Handle BlockBody#blank? at parse time (#1287) 2020-09-03 11:07:13 -04:00
Dylan Thacker-Smith
b08bcf00ac Push interrupts from Continue and Break tags rather than from BlockBody (#1286) 2020-09-03 06:55:24 -04:00
Dylan Thacker-Smith
0740e8b431 Remove unused quirk allowing liquid tags to close a block it is nested in (#1284) 2020-09-03 06:51:56 -04:00
Dylan Thacker-Smith
5532df880f Handle disabled tags errors like other liquid errors (#1275) 2020-08-18 11:39:54 -04:00
Dylan Thacker-Smith
2b11efc3ae Fix performance regression from introduction of Template#disable_tags (#1274) 2020-08-18 11:25:51 -04:00
Thierry Joyal
a1d982ca76 Merge pull request #1272 from Shopify/StaticRegisters/add-test-coverage
[StaticRegisters] Add test coverage
2020-08-04 08:31:45 -04:00
Thierry Joyal
03be7f1ee3 [StaticRegisters] Add test coverage 2020-07-28 10:23:51 -04:00
Dylan Thacker-Smith
1ced4eaf10 Merge pull request #1268 from Shopify/remove-taint-checking
Remove support for taint checking
2020-07-25 21:27:46 -04:00
Dylan Thacker-Smith
4970167726 Bump rake development dependency
Gets rid of a deprecation warning when running the tests.
2020-07-23 16:23:18 -04:00
Dylan Thacker-Smith
065ccbc4aa Remove support for taint checking 2020-07-23 16:22:46 -04:00
Feken Baboyan
1feaa63813 Merge pull request #1258 from Shopify/fix-context-overriding-in-templates
Fix how Template overrides static registers when #render is invoked
2020-05-28 09:32:31 -04:00
Feken Baboyan
8541c6be35 make Template override static registers only when the register key is not defined 2020-05-28 09:08:03 -04:00
Thierry Joyal
18654526c8 Merge pull request #1257 from Shopify/StaticRegisters/remove-registers-attr-reader
[StaticRegisters] Remove registers attr_reader
2020-05-22 14:01:37 -04:00
Thierry Joyal
bd1f7f9492 [StaticRegisters] Remove assertion for delete to not remove static content 2020-05-22 13:42:44 -04:00
Thierry Joyal
40d75dd283 Update test/unit/static_registers_unit_test.rb
Co-authored-by: Dylan Thacker-Smith <dylan.smith@shopify.com>
2020-05-22 12:15:52 -04:00
Thierry Joyal
f5011365f1 [StaticRegisters] Remove registers attr_reader 2020-05-22 10:51:07 -04:00
Thierry Joyal
ebbd046c92 Merge pull request #1250 from Shopify/static-registers/fetch-raise-on-missing
[StaticRegisters] Fetch raise on missing
2020-05-22 09:56:05 -04:00
Thierry Joyal
b9979088ec [StaticRegisters] Fetch raise on missing
Co-authored-by: Dylan Thacker-Smith <dylan.smith@shopify.com>
2020-05-22 09:35:47 -04:00
Dylan Thacker-Smith
bd0e53bd2e Merge pull request #1239 from Shopify/remove-bad-arity-assumption
Fix ParseTreeVisitorTest for ruby-head
2020-05-21 14:02:04 -04:00
Thierry Joyal
4b586f4105 Merge pull request #1251 from Shopify/travis/optional-head
[Travis] Optional head
2020-05-21 13:51:11 -04:00
Thierry Joyal
0410119d5f [Travis] Optional head 2020-05-21 12:45:14 -04:00
Dylan Thacker-Smith
c2f67398d0 Allow ruby-head failures
Ignore an object allocation test failure on ruby-head for now.
2020-03-31 10:53:49 -04:00
Dylan Thacker-Smith
81149344a5 Fix ParseTreeVisitorTest for ruby-head 2020-03-31 10:53:46 -04:00
Dylan Thacker-Smith
e9b649b345 Fix Liquid::Template inheritance (#1227)
self.class.default_resource_limits would return `nil` in a subclass, since
the attribute isn't set on subclasses.
2020-01-21 15:09:22 -05:00
Celso Dantas
9c538f4237 Merge pull request #1207 from Shopify/moving-const-to-const
Use String literal instead
2020-01-20 12:37:57 -05:00
Celso Dantas
c08a358a2b Use String literal instead of using a class method
The class method string definition is not needed here, so it can be removed.
2020-01-16 09:42:32 -05:00
Justin Li
dbaef5e79b Merge pull request #1180 from Shopify/test-all-filters
Test all filters against random data to detect exceptions
2020-01-13 15:52:44 -05:00
Dylan Thacker-Smith
48a155a213 Initialize Liquid::Template class attributes eagerly instead of lazily (#1223) 2020-01-10 17:42:01 -05:00
Dylan Thacker-Smith
c69a9a77c6 Merge pull request #1215 from Shopify/nested-liquid-tag
Fix liquid tag nested in outer block
2020-01-09 19:24:52 -05:00
Dylan Thacker-Smith
ef79fa3898 style: Avoid deep nesting for parsing the liquid tag in the block body 2020-01-09 19:13:13 -05:00
Dylan Thacker-Smith
f7ad602bfc Fix liquid tag nested in outer block 2020-01-09 19:13:13 -05:00
Dylan Thacker-Smith
ffd6049ba2 Merge pull request #1222 from Shopify/bump-ci-ruby
Test against the latest ruby in CI
2020-01-09 18:12:36 -05:00
Dylan Thacker-Smith
b3ad54c0c2 Test against the latest ruby in CI 2020-01-09 13:15:34 -05:00
Dylan Thacker-Smith
67eca3f58d Upgrade rubocop and style guide for ruby 2.7 compatibility 2020-01-09 13:15:34 -05:00
Thierry Joyal
0847bf560f Merge pull request #1218 from Shopify/strainer/remove-safe-navigation
Remove handling of a nil context in the Strainer class
2020-01-07 11:54:49 -05:00
Dylan Thacker-Smith
8074565c3e Merge pull request #1216 from Shopify/unsupported-taint-mode
Remove support for taint_mode on ruby versions that don't support it
2020-01-07 10:12:36 -05:00
Thierry Joyal
24e81267b9 Merge pull request #1208 from Shopify/strainer/revisit
[Strainer] Separate factory from template
2020-01-06 13:56:22 -05:00
Thierry Joyal
c0ffee3ff9 [Strainer] Remove safe navigation 2020-01-06 18:34:13 +00:00
Thierry Joyal
c0ffeeef26 [Strainer] Separate factory from template 2020-01-06 17:45:25 +00:00
Dylan Thacker-Smith
22dbf90b7d Try to stay compatible with ruby-head 2019-12-19 11:12:55 -05:00
Dylan Thacker-Smith
40c68c9c83 Remove support for taint_mode on ruby versions that don't support it 2019-12-19 11:12:51 -05:00
Martin Morissette
b7f0f158ab Merge pull request #1212 from Shopify/template-factory
Introduce template factory
2019-12-19 08:52:22 -05:00
Martin Morissette
d8f31046a9 Introduce template factory 2019-12-17 21:45:08 -05:00
Martin Morissette
6c6382ed69 Merge pull request #1213 from Shopify/allow-failures-ruby-27
Make ruby 2.7 optional in CI
2019-12-16 09:46:12 -05:00
Martin Morissette
53ba1372f9 Make ruby 2.7 optional in CI 2019-12-16 08:59:26 -05:00
Mike Angell
57c9cf64eb Allow render to handle with and for correctly (#1193)
* Allow render to handle with and for correctly

* code improvements
2019-10-23 04:12:46 +10:00
Alessandro Diogo Brückheimer
e83b1e4159 Add ForceEqualSignAlignment to .rubocop.yml (#1190)
* Add ForceEqualSignAlignment to .rubocop.yml

* Revert ForceEqualSignAlignment cop

* Update method alignment

* Undo addition of whitespace to improve readability

* Fix missing alignment
2019-10-21 21:18:48 +10:00
Mike Angell
3784020a8d [New Feature] Add forloop inside render tag when using for syntax (#1191)
* Add forloop to render for syntax

* Remove forloop guard
2019-10-17 23:06:13 +10:00
uchoudh
1223444738 Fix flaky tests (#1186) 2019-10-12 02:52:07 +11:00
Mike Angell
2bfeed2b00 Resolve InputIterator dropping context (#1184)
* Resolve InputIterator dropping context

* Prefer attr_reader
2019-10-09 08:00:16 +11:00
Mike Angell
04b800d768 Add support for as in Render and Include tags (#1181)
* Add support for alias

* Remove duplicate code

* Default to template name

* Improve variable matching

* Extract render_partial

* remove method
2019-10-09 07:59:52 +11:00
Mike Angell
f1d62978ef Allow default function to handle false as value (#1144)
* Allow default function to handle false as value

* Change to named parameter

* Remove redundant freeze

* add brackets to make intention clearer

* Use named param format from liquid

* Update syntax

* document default filter
2019-10-09 04:03:33 +11:00
uchoudh
ffadc64f28 Merge pull request #1172 from Shopify/add-liquid-profiling-attr
Add liquid profile attributes
2019-10-08 10:49:54 -04:00
Mike Angell
5302f40342 Rubocop fixes (#1182) 2019-10-07 17:06:47 +11:00
Mike Angell
b0f8c2c03e Remove error logging 2019-10-05 01:13:35 +10:00
Mike Angell
37e40673ff Filter test 2019-10-04 17:00:54 +10:00
uchoudh
fefee4c675 Add liquid profile attributes
Attribute testing

Add partial name support
2019-10-03 10:12:39 -04:00
Mike Angell
1aa7d3d2ba Change registers to by symbols (#1178) 2019-09-27 04:32:24 +10:00
Mike Angell
0db9c56f34 Disable rendering of tag based on register (#1162)
* Disable rendering of tag based on register

* Improvements to disable tag

* Resolve disbale tag tests

* Test disable_tags register

* disabled_tags is now always avaiable

* Allow multiple tags to be disabled at once

* Move disabled check to block_body

* Code improvements

* Remove redundant nil check

* Improve disabled tag error output

* Improve disable tag API

* Code improvements

* Switch disabled? to not mutate output

* Fix array handling shortcut in disable_tags
2019-09-26 00:18:30 +10:00
Mike Angell
f4d134cd5c Remove jruby and truffleruby testing (#1167) 2019-09-20 02:28:43 +10:00
Mike Angell
b667bcb48b Shopify stye guide fixes (#1160) 2019-09-20 02:08:11 +10:00
Ashwin Maroli
2c14e0b2ba Use Regexp#match? when MatchData is not used (#1165)
* Use `Regexp#match?` when `MatchData` is not used

* Add `TargetRubyVersion: 2.4` to RuboCop config
2019-09-20 02:07:52 +10:00
Ashwin Maroli
ca207ed93f Cleanup RuboCop configuration file (#1161) 2019-09-20 00:55:01 +10:00
Mike Angell
ef13343591 Changes static registers to not be frozen (#1163)
* Changes static registers to not be frozen

* Add frozen test to static registers
2019-09-20 00:24:48 +10:00
Mike Angell
adb40c41b7 Enable frozen_string_literal 2019-09-18 13:40:07 +10:00
Mike Angell
d8403af515 Reimplementation of Static Registers (#1157) 2019-09-18 13:25:55 +10:00
Mike Angell
0d26f05bb8 Enabled frozen string literals (#1154)
* Enabled frozen string literals

* Update rubocop config

* Prefer string interpolation in simple cases

Co-Authored-By: Dylan Thacker-Smith <dylan.smith@shopify.com>
2019-09-18 13:19:45 +10:00
Thierry Joyal
1dcad34b06 Merge pull request #1151 from Shopify/invokable-methods-for-enumerable-reject-include
Invokable methods for enumerable reject include?
2019-09-16 09:49:40 -04:00
Mike Angell
9a42c8c8b2 Merge pull request #1149 from Shopify/liquid-usage
Add usage tracking
2019-09-16 12:14:50 +10:00
Mike Angell
1fcef2133f Merge pull request #1143 from Shopify/styling-fixes-1
Apply simple rubocop fixes
2019-09-16 12:14:32 +10:00
Mike Angell
d7514b1305 Merge pull request #1137 from Shopify/remove-lazy-stacks
Remove lazy load stacks
2019-09-16 12:14:14 +10:00
Thierry Joyal
c0ffee5919 Invokable methods for enumerable reject include? 2019-09-12 12:58:51 +00:00
Mike Angell
724d02e9b3 Disable interrupt fix in this round 2019-09-11 06:35:08 +10:00
Mike Angell
a5b387cdd4 Remove reserved word Interrupt to avoid confusion
Also resolves rubocop conflicts
2019-09-11 06:32:31 +10:00
Mike Angell
8318be2edc Update readme 2019-09-11 05:20:05 +10:00
Mike Angell
b6547f322e Simplify usage 2019-09-11 04:56:25 +10:00
Mike Angell
b316ff8413 Add usage tracking 2019-09-11 04:20:34 +10:00
Justin Li
806b2622da Switch back to Liquid-C master, since https://github.com/Shopify/liquid-c/pull/50 is merged 2019-09-04 15:12:51 -04:00
Mike Angell
1f90a37b63 Merge branch 'master' into styling-fixes-1 2019-09-04 14:26:27 +10:00
Mike Angell
c34f7c9b2c Merge pull request #1145 from Shopify/master-fixes
Render tag styling fixes
2019-09-04 14:25:38 +10:00
Mike Angell
604d899496 Render tag styling fixes 2019-08-31 22:48:25 +10:00
Mike Angell
799da202df Apply simple rubocop fixes 2019-08-31 21:58:33 +10:00
Mike Angell
ddb45cd658 Merge pull request #1139 from Shopify/shopify_ruby_style
Follow Shopify ruby style guide
2019-08-31 21:43:45 +10:00
Mike Angell
dafbb4ae90 Remove hasnling false scopes 2019-08-31 20:03:54 +10:00
Justin Li
9876096cf4 Merge pull request #1141 from ashmaroli/reduce-context-constructor-allocations
Reduce allocations from `Liquid::Context.new`
2019-08-30 12:53:50 -04:00
Ashwin Maroli
8750b4b006 Reduce allocations from Liquid::Context.new 2019-08-30 09:01:47 +05:30
Samuel Doiron
34083c96d5 Merge pull request #1122 from Shopify/render-tag
Add new `{% render %}` tag
2019-08-29 16:49:56 -04:00
Samuel
9672ed5285 Add a new {% render %} tag
Example:

```
// the_count.liquid
{{ number }}! Ah ah ah.

// my_template.liquid
{% for number in range (1..3) %}
  {% render "the_count", number: number %}
{% endfor %}

Output:
1! Ah ah ah.
2! Ah ah ah.
3! Ah ah ah.
```

The `render` tag is a more strict version of the `include` tag. It is
designed to isolate itself from the parent rendering context both by
creating a new scope (which does not inherit the parent scope) and by
only inheriting "static" registers.

Static registers are those that do not hold mutable state which could
affect rendering. This again helps `render`ed templates remain entirely
separate from their calling context.

Unlike `include`, `render` does not permit specifying the target
template using a variable, only a string literal. For example, this
means that `{% render my_dynamic_template %}` is invalid syntax. This
will make it possible to statically analyze the dependencies between
templates without making Turing angry.

Note that the `static_environment` of a rendered template is inherited, unlike
the scope and regular environment. This environment is immutable from within the
template.

An alternate syntax, which mimics the `{% include ... for %}` tag is
currently in design discussion.
2019-08-29 16:32:05 -04:00
Justin Li
f3112fc038 Merge pull request #1136 from ashmaroli/travis-selected-branches
Build only pushes to certain branches on Travis CI
2019-08-29 13:47:59 -04:00
Samuel
d338ccb9a6 Add isolated subcontexts
An isolated subcontext inherits the environment, filters,
and static registers of its supercontext, but with a fresh
(isolated) scope.

This will pave the way for adding the `render` tag, which renders
templates in such a subcontext.
2019-08-29 10:27:15 -04:00
Mike Angell
d67de1c9b2 Follow Shopify ruby style
This is the first step in bringing Liquid style inline with Shopify ruby style
2019-08-29 13:39:57 +10:00
Mike Angell
2324564743 Remove lazy load stacks
Remove lazy load stacks and instead only create a new scope when a tag is known to need one
2019-08-29 09:09:32 +10:00
Ashwin Maroli
b3097f143c Build only pushes to certain branches on Travis CI 2019-08-28 21:28:49 +05:30
Mike Angell
7b309dc75d Merge pull request #1135 from Shopify/fix-failing-rubocop
Resolve failing rubocop issues
2019-08-29 01:11:25 +10:00
Mike Angell
8f68cffdf1 Resolve failing rubocop issues 2019-08-29 00:45:38 +10:00
Mike Angell
dd27d0fd1d Merge pull request #1133 from Shopify/liquid-tag-fixes
Bugfix for new Liquid tag
2019-08-29 00:36:13 +10:00
Mike Angell
7a26e6b3d8 Merge pull request #1131 from Shopify/bump-ruby-2-4
Rubocop upgrade, Ruby 2.4 minimum and TruffleRuby
2019-08-29 00:33:42 +10:00
Mike Angell
cf4e77ab0c Merge branch 'master' into bump-ruby-2-4 2019-08-29 00:24:45 +10:00
Mike Angell
7bae55dd39 Bugfix for new Liquid tag 2019-08-28 23:39:19 +10:00
Tobias Lütke
0ce8aef229 Merge pull request #1103 from ashmaroli/ci-profile-memory
Add a CI job to profile memory usage of commit
2019-08-27 15:11:55 -04:00
Tobias Lütke
6eab595fae Merge pull request #1086 from Shopify/liquid-tag
Add {% liquid %} and {% echo %} tags
2019-08-27 15:10:20 -04:00
Mike Angell
b16b109a80 Bump Minimum version to 2.4 and bump Rubocop 2019-08-28 00:31:44 +10:00
Justin Li
831355dfbd Merge pull request #1117 from ashmaroli/reduce-allocations-template-lookup-class
Reduce allocations while registering Liquid tags
2019-08-07 16:37:39 -04:00
Ashwin Maroli
00702d8e63 Use Object.const_get directly 2019-08-07 11:44:53 +05:30
Justin Li
197c058208 Merge pull request #1099 from ashmaroli/stash-types-private-constant
Use a private constant to stash token-types
2019-08-06 17:56:56 -04:00
Justin Li
98dfe198e1 Merge pull request #1115 from ashmaroli/reduce-allocations-from-truncate-filters
Reduce string allocations from truncate filters
2019-08-06 17:48:43 -04:00
Ashwin Maroli
c2c1497ca8 Reduce allocations while registering Liquid tags 2019-07-22 20:42:37 +05:30
Ashwin Maroli
d19967a79d Reduce string allocations from truncate filters 2019-07-22 17:35:45 +05:30
Florian Weingarten
248c54a386 Merge pull request #1091 from Shopify/rendering-with-less-garbage
Rendering with less garbage
2019-07-19 15:53:22 +01:00
Ashwin Maroli
2c42447659 Rename constant to SINGLE_TOKEN_EXPRESSION_TYPES 2019-05-17 23:30:24 +05:30
Ashwin Maroli
ab698191b9 Add a CI job to profile memory usage of commit 2019-05-17 22:47:05 +05:30
Ashwin Maroli
9ef6f9b642 Freeze mutable object assigned to constant 2019-04-29 23:50:49 +05:30
Ashwin Maroli
4684478e94 Use a private constant to stash token-types 2019-04-29 23:45:45 +05:30
Florian Weingarten
b3b63a683f Merge pull request #1097 from ashmaroli/stackprof-no-jruby
Don't attempt to install stackprof gem on JRuby
2019-04-24 09:11:44 -04:00
Ashwin Maroli
1c577c5b62 Don't attempt to install stackprof gem on JRuby 2019-04-24 11:31:20 +05:30
David Cornu
755d2821f3 Merge pull request #1094 from Shopify/for-tag/invalid-limit-offset
Make sure the for tag's limit and offset are integers
2019-04-23 17:20:54 -04:00
David Cornu
495b3d312f Merge pull request #1095 from Shopify/travis/remove-rainbow-gem
Stop installing the rainbow gem on Travis
2019-04-23 17:20:38 -04:00
Florian Weingarten
9640e77805 render_to_output_buffer 2019-04-23 17:06:29 -04:00
David Cornu
453f6348c2 Stop installing the rainbow gem on Travis 2019-04-23 16:55:37 -04:00
David Cornu
70ed1fc86d Make sure the limit and offset values are integers 2019-04-23 16:44:37 -04:00
Florian Weingarten
2a1ca3152d liquid without the garbage 2019-04-22 16:34:31 -04:00
Florian Weingarten
c2ef247be5 Merge pull request #1092 from Shopify/rake-memory-profiler-task
rake memory_profile:run
2019-04-22 16:33:32 -04:00
Florian Weingarten
1518d3f6f9 Merge pull request #1093 from Shopify/bytesize-not-length
use bytesize, not length
2019-04-18 18:39:21 +01:00
Florian Weingarten
c67b77709d rake memory_profile:run 2019-04-17 19:09:26 +01:00
Florian Weingarten
c89ce9c2ed use bytesize, not length 2019-04-17 18:55:13 +01:00
Justin Li
7dc488a73b Simplifications from review 2019-04-09 15:19:47 -04:00
Justin Li
e6ed804ca5 Fix line number tracking after a non-empty blank token 2019-04-08 18:43:09 -04:00
Justin Li
951abb67ee Remove {% local %} tag 2019-04-08 18:34:39 -04:00
Justin Li
8d1cd41453 Add {% liquid %}, {% echo %}, and {% local %} tags 2019-04-01 20:08:38 -04:00
Richard Monette
b0629f17f7 Merge pull request #1073 from Shopify/defer-alloc-hash
defer hash allocation until needed for unparsed_args
2019-03-20 13:34:48 -04:00
Richard Monette
274f078806 defer hash allocation in parse_filter_expressions
add exploration of GC object allocation

remove performance test

can actually remove one more if branch

use named locals to improve readability
2019-03-20 13:20:31 -04:00
Richard Monette
d7171aa084 Merge pull request #1077 from Shopify/update-cops-for-trailing-comma
update Rubocop for trailing comma styles
2019-03-19 16:02:26 -04:00
Richard Monette
06c4789dc5 update Rubocop for trailing comma styles 2019-03-19 11:05:05 -04:00
Justin Li
f2f467bdbc v4.0.3 2019-03-12 12:43:48 -04:00
Justin Li
ff99d92c18 Merge pull request #1072 from Shopify/fix-interrupts
Fix interrupts through includes
2019-03-12 12:26:12 -04:00
Justin Li
39fecd06db Fix interrupts through includes 2019-03-12 12:18:22 -04:00
Justin Li
8013df8ca2 v4.0.2 2019-03-08 15:43:46 -05:00
Clayton Smith
14cd011cb5 Merge pull request #1070 from Shopify/url-decode-validation
Validate the character encoding in url_decode.
2019-03-08 11:09:40 -05:00
Clayton Smith
e2d9907df2 Validate the character encoding in url_decode. 2019-03-07 14:01:10 -05:00
Justin Li
23d669f5e6 Merge pull request #1032 from printercu/patch-1
Single regexp for strip_html
2019-02-22 13:04:04 -05:00
Justin Li
ed73794f82 Preserve existing strip_html behaviour for weird inputs 2019-02-22 13:00:36 -05:00
Ashwin Maroli
f59f6dea83 Fix simple RuboCop offenses and update TODO file (#1062)
* Fix Layout/EmptyLineAfterMagicComment offense

* Fix Layout/ExtraSpacing offense

* Fix Layout/ClosingParenthesisIndentation offenses

* Fix Style/MutableConstant offense

* Fix Style/UnneededInterpolation offenses

* Fix Style/RedundantParentheses offenses

* Update TODO config for RuboCop

* Add executable bit to test/test_helper.rb

ref: https://travis-ci.org/Shopify/liquid/jobs/488169512#L578
2019-02-22 12:32:56 -05:00
Garland Zhang
7a81fb821a Merge pull request #1059 from Shopify/map_error_checking
Apply error-checking to sort, sort_natural, where, uniq, map, compact filter(s)
2019-02-22 10:42:16 -05:00
Garland Zhang
cec27ea326 Extract raise error line and some filters with begin/rescue blocks 2019-02-21 17:00:20 -05:00
Justin Li
14999e8f7c Merge pull request #1053 from er1/update-changelog-v4.0.1
Updated changelog for v4.0.1 for (#1038)
2019-02-10 10:37:31 -05:00
Eric Chan
b41fc10d8e Updated changelog for v4.0.1 2018-12-03 23:54:00 -05:00
David Cornu
2b3c81cfd0 Merge pull request #1046 from Shopify/make-builds-green
Make builds green
2018-10-24 10:46:01 -04:00
David Cornu
2a2376bfd9 Run :test before :rubocop in the default Rake task 2018-10-19 15:06:36 -04:00
David Cornu
ca9e75db53 Reduce perceived complexity for #sort and #sort_natural 2018-10-19 14:57:33 -04:00
David Cornu
407c8abf30 Use TrailingCommaInLiteral
TrailingCommaInArrayLiteral and TrailingCommaInHashLiteral were introduced in v0.53.0 and we're running v0.49.0.

https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md#0530-2018-03-05
2018-10-19 14:52:16 -04:00
Justin Li
43f181e211 Merge pull request #1044 from Shopify/enable-cla-bot
Enable CLA bot
2018-10-19 09:34:30 -04:00
Tim Layton
7c613e87cb Enable CLA bot 2018-10-18 23:10:56 -07:00
Stephen Paul Weber (Work)
fe4034ccf9 Merge pull request #1025 from Shopify/traverse-ast
Liquid::ParseTreeVisitor
2018-10-18 09:42:56 -04:00
Stephen Paul Weber
52ee303a36 s/block.call/yield 2018-10-18 09:41:53 -04:00
Stephen Paul Weber
8217a8d86c Add test for the full array structure 2018-10-18 09:39:05 -04:00
Stephen Paul Weber
7d13d88258 s/Traversal/ParseTreeVisitor 2018-10-18 09:38:33 -04:00
Stephen Paul Weber
ff727016ef s/callback_for/add_callback_for 2018-10-18 09:37:48 -04:00
Stephen Paul Weber
c11fc656cf Colocate Traversal classes with classes they traverse
This puts all knowledge of the traversal in the same file, and removes
the need for a CASES registry.
2018-10-18 09:37:48 -04:00
Stephen Paul Weber
d789ec4175 Liquid::Traversal
This enables traversal over whole document tree.
2018-10-15 10:11:58 -04:00
Samuel Doiron
fd09f049b0 Merge pull request #1026 from Shopify/where-filter
Add `where` filter to standard filters
2018-10-11 17:45:30 -04:00
Samuel
842986a972 Add where filter to standard filters
Users of Liquid will often wish to filter an array to only those items that match a certain criteria. For example, showing "pinned" messages at the top of a list.

Example usage:

`{{ comments | where: "pinned" | first }}`

or

`{{ products | where: "category", "kitchen" }}`

* Add where filter to standard filters
* Add tests for new where functionality
2018-10-11 16:52:32 -04:00
Florian Weingarten
4661700a97 bump to v4.0.1 2018-10-09 11:13:19 +02:00
Justin Li
cd5a6dd225 Merge pull request #930 from er1/fix-sort-natural-on-nil
Fix sort and sort_natural on sorting with non-string and nil values
2018-10-04 22:32:37 -04:00
printercu
89c1ba2b0e Fix rubocop warning 2018-09-27 17:24:01 +03:00
printercu
479d8fb4a4 Single regexp for strip_html 2018-09-27 17:13:35 +03:00
Justin Li
53b8babf52 Merge pull request #1027 from Shopify/rubocop-fix
Update deprecated rubocop name
2018-09-13 17:16:36 -04:00
Justin Li
76b4920d3e Update deprecated rubocop name 2018-09-13 17:15:32 -04:00
Justin Li
8dcc319128 Merge pull request #1024 from koic/suppress_warning_bigdecimal_new
Suppress warning: `BigDecimal.new` is deprecated
2018-09-09 08:28:24 -04:00
Koichi ITO
0b36461d80 Suppress warning: BigDecimal.new is deprecated
## Summary

`BigDecimal.new` is deprecated since BigDecimal 1.3.3 for Ruby 2.5.

This PR suppresses the following warnings.

```console
% ruby -v
ruby 2.6.0dev (2018-09-06 trunk 64648) [x86_64-darwin17]
% RUBYOPT=-w bundle exec rake
(snip)
/Users/koic/src/github.com/Shopify/liquid/lib/liquid/utils.rb:49:
warning: BigDecimal.new is deprecated; use Kernel.BigDecimal method
instead.
/Users/koic/src/github.com/Shopify/liquid/lib/liquid/utils.rb:53:
warning: BigDecimal.new is deprecated; use Kernel.BigDecimal method
instead.
```

## Other Information

The following is a change of BigDecimal 1.3.3 for Ruby 2.5 related to this PR.

- 533737338d
- 16738ad0ac
2018-09-09 21:10:20 +09:00
Justin Li
70e75719de Merge pull request #1010 from Shopify/circle-ci-remove-38409b
Goodbye CircleCI 👋
2018-05-15 10:53:51 -04:00
shopify-admins
b037b19688 Removing CircleCI 1.0 [ci skip] 2018-05-15 10:35:38 -04:00
Florian Weingarten
d0f77f6cf4 Merge pull request #1006 from Benhgift/master
add installation instruction
2018-04-26 18:20:02 +01:00
Ben Gift
0be260bc97 add installation instruction 2018-04-26 08:12:47 -07:00
Dylan Thacker-Smith
5f0b64cebc Merge pull request #1005 from christopheraue/render_refactor
Refactored and optimized rendering
2018-04-19 16:44:57 -04:00
Christopher Aue
c086017bc9 refactored and optimized rendering
Measures:
1) A while loop is faster than iterating with #each.
2) Check string, variable and block tokens first. They are far more
   frequent than interrupt tokens. In their case, checking for an
   interrupt can be avoided.
3) String tokens just map to themselves and don't need the special
   treatment of BlockBody#render_node (except the resource limit
   check).

Benchmark
=========

$ bundle exec rake benchmark:run

Before
------

Run 1)
              parse:     41.630  (± 0.0%) i/s -    420.000  in  10.089309s
             render:     75.962  (± 3.9%) i/s -    763.000  in  10.066823s
     parse & render:     25.497  (± 0.0%) i/s -    256.000  in  10.040862s

Run 2)
              parse:     42.130  (± 0.0%) i/s -    424.000  in  10.064738s
             render:     77.003  (± 1.3%) i/s -    777.000  in  10.093524s
     parse & render:     25.739  (± 0.0%) i/s -    258.000  in  10.024581s

Run 3)
              parse:     41.976  (± 2.4%) i/s -    420.000  in  10.021406s
             render:     76.184  (± 1.3%) i/s -    763.000  in  10.018104s
     parse & render:     25.641  (± 0.0%) i/s -    258.000  in  10.062549s

After
-----

Run 1)
              parse:     42.283  (± 0.0%) i/s -    424.000  in  10.028306s
             render:     83.158  (± 2.4%) i/s -    832.000  in  10.009201s
     parse & render:     26.417  (± 0.0%) i/s -    266.000  in  10.069718s

Run 2)
              parse:     41.159  (± 4.9%) i/s -    412.000  in  10.031297s
             render:     81.591  (± 3.7%) i/s -    816.000  in  10.018225s
     parse & render:     25.924  (± 3.9%) i/s -    260.000  in  10.035653s

Run 3)
              parse:     42.418  (± 2.4%) i/s -    424.000  in  10.003100s
             render:     84.183  (± 2.4%) i/s -    847.000  in  10.069781s
     parse & render:     26.726  (± 0.0%) i/s -    268.000  in  10.029857s
2018-04-19 12:10:15 +02:00
Dylan Thacker-Smith
4369fe6c85 Improve the unexpected end delimiter message for block tags. (#1003) 2018-04-05 11:18:13 -04:00
Justin Li
c118e6b435 Merge pull request #992 from ashmaroli/each-without-index
Replace unnecessary Array#each_with_index with Array#each
2018-03-16 14:28:05 -04:00
Ashwin Maroli
0fbaf873d9 replace unnecessary #each_with_index with #each 2018-03-16 14:31:43 +05:30
Justin Li
5980ddbfae Merge pull request #988 from ashmaroli/regex-to-constant
Assign regexps to constants
2018-03-14 16:49:17 -04:00
Ashwin Maroli
193fc0fb7a revert to earlier regex for matching floats 2018-03-14 07:02:04 +05:30
Ashwin Maroli
e4da4d49d2 assign regex to a constant 2018-03-13 23:36:56 +05:30
Justin Li
a0bec1f873 Merge pull request #981 from nicolasleger/patch-1
[CI] Test against Ruby 2.5 version
2018-03-05 11:23:18 -05:00
Nicolas Leger
4aa3261518 [CI] Test against Ruby 2.5 version 2018-02-12 00:23:06 +01:00
Dylan Thacker-Smith
04d552fabb Gemfile: Use https rather than git protocol to fetch liquid-c 2018-02-01 07:08:19 -05:00
Dylan Thacker-Smith
5106466a2d Add a regression test for a liquid-c trim mode bug (#972) 2018-01-25 10:55:01 -05:00
Justin Li
5d6c1ed7c6 Merge pull request #963 from lostapathy/patch-1
have travis test against ruby 2.4
2017-12-15 16:53:26 -05:00
Joe Francis
a594653a0c have travis test against ruby 2.4 2017-12-15 14:27:17 -06:00
Thibaut Courouble
0c802aba17 Merge pull request #958 from Shopify/minmax
Rename min/max filters for clarity
2017-12-06 11:41:12 -05:00
Thibaut Courouble
147d7ae24d Rename min/max filters for clarity 2017-12-06 09:48:30 -05:00
Thibaut Courouble
282d42f98d Fix min/max filters 2017-12-06 08:58:05 -05:00
Justin Li
e6ba6ee87b Revert "Use replacement string for replace filters literally (#924)"
This reverts commit 27c91203ab.
2017-12-04 15:07:59 -05:00
Nithin Bekal
2ad7a37d44 Merge pull request #954 from Shopify/max-min-filters
Add max and min filters
2017-11-30 14:18:43 -05:00
Nithin Bekal
4bdaaf069f Add max/min filters 2017-11-30 13:56:37 -05:00
Justin Li
85b1e91aed Merge pull request #952 from Shopify/bump-rubocop
Bump rubocop
2017-11-22 12:44:36 -05:00
Justin Li
a7c5e247c8 Bump rubocop 2017-11-22 11:59:06 -05:00
Dylan Thacker-Smith
6c117fd7dd refactor: Reduce maximum block nesting in Liquid::BlockBody#parse (#944) 2017-10-19 10:12:40 -04:00
Maxime Bedard
7d2d90d715 Merge pull request #932 from Shopify/avoid-default-values-hash
Avoid hash with default values due to inconsistent marshaling
2017-10-17 16:02:45 -04:00
Maxime Bedard
f761d21215 Use {} notation 2017-09-20 09:48:23 -04:00
Maxime Bedard
a796c17f8b Avoid hash with default values due to inconsistent marshalling 2017-09-19 16:23:14 -04:00
Eric Chan
deb10ebc7a Sorting support for data with undefined values 2017-09-14 02:00:43 -04:00
Eric Chan
cfe1844de9 Added test coverage for sort_natural 2017-09-13 22:17:59 -04:00
Eric Chan
59950bff87 Fix sort_natural on sorting with non-string values 2017-09-13 01:37:40 -04:00
Dylan Thacker-Smith
27c91203ab Use replacement string for replace filters literally (#924) 2017-08-28 11:51:20 -04:00
Justin Li
44eaa4b9d8 Merge pull request #920 from Shopify/symbol_to_liquid
Support rendering symbols as strings
2017-08-18 12:10:53 -04:00
Pascal Betz
a979b3ec95 Do not raise when variable is defined but nil when using strict_variables 2017-08-18 12:09:57 -04:00
Justin Li
bf3e759da3 Support rendering symbols as strings 2017-08-17 23:10:57 -04:00
Rene
59162f7a0e added attr_readers for collection and variable names in for tag (#909) 2017-07-06 09:41:48 -04:00
Thierry Joyal
c582b86f16 Merge pull request #898 from Shopify/cgi-powered-standard-filters-to-handle-non-string-inputs
CGI powered standard filters to handle non string inputs
2017-05-26 18:05:42 +00:00
Thierry Joyal
e340803d12 CGI powered standard filters to handle non string inputs 2017-05-25 15:53:41 +00:00
Dylan Thacker-Smith
48a6d86ac2 Use stackprof to test to lack of object allocations (#896) 2017-05-12 09:20:51 -04:00
Dylan Thacker-Smith
3bb29d5456 Replace assert_equal nil, with a assert_nil (#895) 2017-05-11 14:05:03 -04:00
Dylan Thacker-Smith
9c72ccb82f Limit how much blocks can be nested during parsing (#894) 2017-05-11 09:37:53 -04:00
Dylan Thacker-Smith
62d4625468 Use a loop to strictly parse binary comparisons to avoid recursion (#892)
Using recursion allows a malicious template to cause a SystemStackError
2017-05-10 10:41:52 -04:00
Dylan Thacker-Smith
8928454e29 Use a loop to evaluate binary comparisions to avoid recursion (#891)
Using recursion allows a malicious template to cause a SystemStackError
2017-05-10 10:41:24 -04:00
Florian Weingarten
1370a102c9 Merge pull request #789 from evulse/contains-strict-fix
Allow variables to start with contains in strict parser
2017-03-24 09:50:31 -04:00
Mike Angell
c9bac9befe Merge branch 'master' into contains-strict-fix 2017-03-24 11:09:09 +10:00
Mike
210a0616f3 Update History to include fix 2017-03-24 10:35:56 +10:00
Lasse Skindstad Ebert
5149cde5c3 Fix include tag used with strict_variables (#829)
Fixes https://github.com/Shopify/liquid/issues/828
2017-03-22 16:00:31 -04:00
Florian Weingarten
22f2cec5de Merge pull request #864 from chenxianyu2015/fix-strainer-add_filter-method
fix  #861: duplicate inclusion condition logic error of Liquid::Strainer.add_filter method
2017-02-23 14:06:20 -05:00
chenxianyu
4318240ae0 test: modify Strainer.add_filter duplicate inclusion test case 2017-02-22 10:33:22 +08:00
chenxianyu
aa79c33dda fix: Strainer.add_filter method 2017-02-13 15:50:19 +08:00
Justin Li
b1ef28566e Merge pull request #846 from mrmanc/master
Clarifies spelling of for’s reversed flag to address #843
2017-02-10 19:26:38 -05:00
Justin Li
41bcc48222 Merge pull request #854 from jaredbeck/patch-1
Docs: Help people upgrade to 4, re: liquid_methods
2017-02-10 19:25:04 -05:00
Dylan Thacker-Smith
27d5106dc9 Merge pull request #860 from Shopify/handle-string-node-render-exc
Avoid calling line_number on String node when rescuing a render error.
2017-02-10 14:13:11 -05:00
Dylan Thacker-Smith
7334073be2 Avoid duck typing to detect whether to call render on a node. 2017-02-10 13:49:26 -05:00
Dylan Thacker-Smith
5dcefd7d77 Avoid calling line_number on String node when rescuing a render error. 2017-02-07 15:34:10 -05:00
Richard Monette
25c7b05916 Merge pull request #857 from Shopify/handle-join-on-fixnum
handle join on fixnum
2017-02-01 14:25:40 -05:00
Richard Monette
d17f86ba4d handle join on fixnum 2017-02-01 12:47:35 -05:00
Jerry Liu
384e4313ff Merge pull request #851 from Shopify/benchmark-render
Allow benchmarks to benchmark render by itself
2017-01-31 17:18:56 -05:00
Jerry Liu
23f2af8ff5 fix travis build 2017-01-31 17:04:36 -05:00
Jerry Liu
a93eac0268 Introduce new benchmarking methods to liquid to use on rubybench 2017-01-27 10:56:16 -05:00
Florian Weingarten
2cc7493cb0 Merge pull request #855 from Shopify/bundler-benchmark-group
Create a benchmark group in Gemfile
2017-01-20 16:41:11 -05:00
Jerry Liu
85463e1753 add benchmark-ips to benchmark group in Gemfile 2017-01-20 16:04:42 -05:00
Jared Beck
52ff9b0e84 Docs: Help people upgrade to 4, re: liquid_methods
The discussion in #568 helped me.

[ci skip]
2017-01-19 14:23:39 -05:00
Dylan Thacker-Smith
0c58328a40 test: Equality comparison of two hashes (#850) 2017-01-16 15:56:38 -05:00
Dylan Thacker-Smith
2bb3552033 Fix internal liquid error when comparing hash with incompatible type (#849) 2017-01-16 13:13:17 -05:00
Mark Crossfield
8b751ddf46 Removes a non ascii character from comment to appease Rubocop 2017-01-09 10:16:35 +00:00
Mark Crossfield
e5cbdb2b27 Clarifies spelling of for’s reversed flag to address #843
It should now be harder to read the docs and miss the extra letter required for reversed compared to reverse, which causes a fairly generic syntax warning when trying to reverse sort a collection in a for loop.
2017-01-08 12:44:12 +00:00
Justin Li
ffb0ace303 Update changelog for 4.0.0 2016-12-16 13:11:22 -05:00
Florian Weingarten
ad00998ef8 bump to v4 2016-12-14 11:58:42 -05:00
Dylan Thacker-Smith
869dbc7ebf feature: Allow a default exception renderer to be specified (#837)
This could be used to preserve the old default of rendering
non-Liquid::Error messages or for providing default behaviour like error
reporting which could be missed if the exception renderer needed to be
specified on each render.
2016-12-12 10:29:09 -05:00
Dylan Thacker-Smith
fae3a2de7b Add version constraint to rake to fix CI (#836) 2016-12-09 14:01:15 -05:00
Dylan Thacker-Smith
f27bd619b9 change: Render an opaque internal error by default for non-Liquid::Error (#835)
These errors may contain sensitive information, so is safer to
render a more vague message by default.

This is done by replacing non-Liquid::Error exceptions with a
Liquid::InternalError exception with the non-Liquid::Error accessible on
through the cause method. This also allows the template name and line
number to be attached to the template errors.

The exception_handler render option has been changed to exception_renderer
since now it should raise an exception to re-raise on a liquid rendering
error or return a string to be rendered where the error occurred.
2016-12-07 17:34:29 -05:00
Dylan Thacker-Smith
a9b84b7806 test: Use ruby 2.1 in Circle CI 2016-12-05 15:36:42 -05:00
Dylan Thacker-Smith
6cc2c567c5 Merge pull request #832 from Shopify/drop-ruby-2.0
Drop support for ruby 2.0
2016-12-05 13:56:15 -05:00
Dylan Thacker-Smith
812e3c51b9 test: Add ruby 2.3.3 to CI
Travis doesn't have a ruby 2.3 alias, so the latest 2.3.x version is
specified instead.
2016-12-05 13:53:02 -05:00
Dylan Thacker-Smith
9dd0801f5c Drop support for ruby 2.0
It is no longer maintained upstream
2016-12-05 13:51:49 -05:00
Dylan Thacker-Smith
b146b49f46 fix: Clear the strainer cache when a global filter is added (#826) 2016-11-24 10:32:11 -05:00
Richard Monette
86944fe7b7 Merge pull request #809 from Shopify/introduce-unhandled-liquid-exception
introduce unhandled liquid exception
2016-10-31 10:20:06 -04:00
Richard Monette
a549d289d7 introduce unhandled liquid exception
check arity
2016-10-28 09:40:44 -04:00
Richard Monette
b2feeacbce Merge pull request #812 from Shopify/allow-split-to-accept-numeric
allow split to accept numeric
2016-10-26 10:59:44 -04:00
Richard Monette
143ba39a08 allow split to accept numeric 2016-10-26 10:43:04 -04:00
Richard Monette
43e59796f6 Merge pull request #805 from Shopify/dont-explode-when-sorting-nil-property
dont explode when sorting nil property
2016-10-05 10:18:16 -04:00
Richard Monette
bb3624b799 dont explode when sorting nil property 2016-10-04 13:22:29 -04:00
Konstantin Tennhard
64fca66ef5 Merge pull request #797 from Shopify/truncatewords-resiliency
Standard filter truncate / truncatewords: force truncate_string to string
2016-09-13 10:43:55 -04:00
Florian Weingarten
e9d7486758 4.0.0.rc3 2016-09-13 06:33:20 -04:00
Philibert Dugas
2bb98c1431 Merge pull request #798 from PhilibertDugas/bugfix-#697
Fixing #697 with better exception
2016-09-12 13:53:22 -04:00
Konstantin Tennhard
95d5c24bfc Standard filter truncate: truncate_string string coercion
The argument `truncate_string` is now coerced into a string to avoid
`NoMethodError`s. This is mostly for added resiliency. It is doubtful
that someone would actually intent to use a number as truncate string,
but accidentally supplying one is entirely possible.
2016-09-12 12:13:12 -04:00
Philibert Dugas
b7ee1a2176 Fixing #697 with better exception
When including a template which is not defined, the exception raised is
*undefined method `split` for nil:NilClass*

This occurs for a scenario like the following:
`{% include nil %}`
or
`{% include undefined-var %}`

Making the code raise an argument error to allow better understanding of
the include error
2016-09-12 09:31:59 -04:00
Florian Weingarten
0eca61a977 Merge pull request #799 from kainjow/patch-1
Update liquid-c
2016-09-12 08:12:14 -04:00
Kevin Wojniak
9bfd04da2d Update liquid-c 2016-09-10 09:23:15 -07:00
Konstantin Tennhard
302185a7fc Standard filter truncatewords: force truncate_string to string
Currently, `truncatewords` raises a TypeError when the argument
`truncate_string` is an interger. This PR forces string coercion for any
value provided for this argument. Thus,

```ruby
assert_equal 'one two1', @filters.truncatewords("one two three", 2, 1)
```

holds true. Another option would be to raise a `Liquid::ArgumentError`.

What is preferred?
2016-09-09 16:50:50 -04:00
Michael Angell
6ed6e7e12f Allow :id to start with the word contains 2016-08-20 20:32:46 +10:00
Mike Angell
f41ed78378 Merge pull request #1 from Shopify/master
Pull inline with upstream
2016-08-17 21:30:08 +10:00
Florian Weingarten
50c85afc35 Merge pull request #786 from Shopify/bump-liquid-c
Bump LiquidC for whitespace changes
2016-08-11 13:38:42 -04:00
Florian Weingarten
5876dff326 Bump LiquidC for whitespace changes 2016-08-11 13:21:39 -04:00
Florian Weingarten
f25185631d Merge pull request #773 from evulse/whitespace-trim
Add whitespace control character and associated tests
2016-08-11 13:20:12 -04:00
Michael Angell
283f1bad18 Use .last instead of pop push method for updating last node in nodelist 2016-07-08 20:49:30 +10:00
Michael Angell
e1d40c7d89 Add whitespace control character and associated tests 2016-06-28 09:15:45 +10:00
Justin Li
19c6eb426a Merge pull request #769 from zacstewart/patch-1
Fix doc formatting of code examples in file_system
2016-06-15 17:10:11 -04:00
Zac Stewart
f87b06095d Fix doc formatting of code examples in file_system
These code examples are being rendered as paragraph text in the docs.
2016-06-15 15:34:14 -04:00
Gaurav Chande
b81d54e789 Merge pull request #761 from Shopify/range-to_liquid
Support Range Type
2016-06-02 16:48:30 -04:00
Gaurav Chande
00f53b16e8 Prevent Range usage in templates from blowing up 2016-06-02 16:38:44 -04:00
Gaurav Chande
e4cf55b112 Merge pull request #748 from Shopify/expose-tags
Make Template.tags loop-able
2016-04-25 11:59:37 -04:00
Gaurav Chande
5bb211d933 Ensure no tag leakage since registry is global 2016-04-25 11:50:46 -04:00
Gaurav Chande
6adc431a19 Make tag registry enumerable 2016-04-25 11:38:42 -04:00
Justin Li
23d2beed41 Merge pull request #744 from Shopify/raw-syntax-method
Make markup validation a method on Liquid::Raw
2016-04-13 17:08:02 -04:00
Drew Martin
a80ecb7678 make markup validation a method on Liquid::Raw 2016-04-13 14:52:30 -04:00
Florian Weingarten
361c695264 Merge pull request #736 from Shopify/abs-filter
Abs filter
2016-04-05 09:13:56 -04:00
Florian Weingarten
f93243cc1a abs filter 2016-04-04 09:32:31 -04:00
Florian Weingarten
1e533a52e7 Merge pull request #735 from Shopify/fix-to-number-for-negative-float-strings
Fix to_number filter for negative float strings
2016-03-31 15:52:51 -04:00
Dylan Thacker-Smith
3ea84f095f Merge pull request #734 from Shopify/concat-liquid-error
Raise a Liquid::Error when a non-array is passed into the concat filter.
2016-03-31 15:47:43 -04:00
Dylan Thacker-Smith
4239c899a4 Raise a Liquid::Error when a non-array is passed into the concat filter. 2016-03-31 15:47:06 -04:00
Florian Weingarten
1597f8859f Fix to_number filter for negative float strings 2016-03-31 09:18:55 -04:00
Florian Weingarten
b3dda384c9 Merge pull request #733 from Shopify/fix-some-ruby-warnings
Fix a bunch of Ruby warnings
2016-03-30 17:09:00 -04:00
Florian Weingarten
6828670bfe Merge pull request #732 from Shopify/v400rc2
Release v4.0.0rc2
2016-03-30 17:02:34 -04:00
Florian Weingarten
d2f16d92d6 Fix a bunch of Ruby warnings 2016-03-30 20:42:30 +00:00
Justin Li
d233acb483 Update history to reflect merge of #731 2016-03-30 16:36:57 -04:00
Florian Weingarten
8920e2a2a2 Release v4.0.0rc2 2016-03-30 20:13:21 +00:00
Justin Li
bfee507005 Merge pull request #731 from ismasan/duck_typed_maths_filters
Duck typed maths filters
2016-03-30 16:09:16 -04:00
Ismael Celis
929c89789f Test that all maths filters work with duck-typed #to_number 2016-03-30 13:35:09 -03:00
Ismael Celis
d03c4ae8e8 Allow Utils.to_number to work with anything that responds to #to_number 2016-03-30 01:57:21 -03:00
Justin Li
021bafd260 Merge pull request #725 from jeroenvisser101/performance-start-with-vs-regex
Use start_with? instead of Regex
2016-03-21 10:34:28 -04:00
Jeroen Visser
04c393ab07 Use start_with? instead of Regex
Performance is increased by doing this:

  require 'benchmark'
  require 'tempfile'

  n = 50000
  test = File.expand_path(Tempfile.new('foo'))
  Benchmark.bm(20) do |x|
    x.report("Regex:") do
      n.times { test =~ /\A#{test}/ }
    end
    x.report("String#start_with?:") do
      n.times { test =~ test.start_with?(test) }
    end
  end

Benchmark result:
                             user     system      total        real
  Regex:                 0.440000   0.010000   0.450000 (  0.447357)
  String#start_with?:    0.000000   0.000000   0.000000 (  0.006313)
2016-03-21 14:23:35 +01:00
Gaurav Chande
9a7778e52c Merge pull request #707 from Shopify/drop-without-context
@context not always present on a Drop
2016-03-01 18:07:16 -05:00
Gaurav Chande
dde00253f9 context is not always present on a Drop 2016-03-01 21:22:11 +00:00
Gaurav Chande
18d1644980 Merge pull request #705 from Shopify/register-filter-warn
Strainer#add_filter Raises on Private Override
2016-02-24 15:31:41 -05:00
Gaurav Chande
c424d47274 Add changelog entry for Strainer method override change 2016-02-24 20:23:57 +00:00
Gaurav Chande
8e6b9d503d Make Strainer also raise when registered method is overriden as protected 2016-02-24 20:23:49 +00:00
Gaurav Chande
8be38d1795 Strainer#add_filter should raise when registered method is overriden as private 2016-02-24 20:03:17 +00:00
Justin Li
3146d5c3f2 Grammatic and other fixes to CONTRIBUTING.md 2016-02-02 23:45:37 -05:00
Justin Li
0cc8b68a97 Make logic in Context#lookup_and_evaluate more understandable 2016-02-02 23:22:46 -05:00
Justin Li
5a50c12953 Update history to reflect merge of #691
[ci skip]
2016-02-02 23:14:41 -05:00
Justin Li
a6fa4c5c38 Merge pull request #691 from urbandictionary/missing_variables_and_filters
Merge pull request 691
2016-02-02 23:13:44 -05:00
Ivan Kuznetsov
dadd9b4dd2 Add strict_variables/strict_filters render options to check for undefined variables and filters 2016-02-03 10:49:33 +07:00
Justin Li
6434b8d2bb Merge pull request #696 from Shopify/no-send
Remove possibility for arbitrary sends
2016-02-02 11:01:46 -05:00
Justin Li
2d891ddd8f Merge pull request #695 from Shopify/assign-score
Take nested values into account for assign score
2016-02-01 13:14:40 -05:00
Justin Li
60b508b151 Use #each to avoid extra allocations 2016-02-01 13:01:25 -05:00
Justin Li
3891f14a1a Take nested values into account for assign score 2016-02-01 13:01:25 -05:00
Justin Li
198f0aa366 Add test for nested assign score bookkeeping 2016-02-01 13:01:23 -05:00
Justin Li
f2e6adf566 Remove arbitrary send vector 2016-02-01 11:38:40 -05:00
Justin Li
08de6ed2c5 Merge pull request #687 from pathawks/default
Performance improvement: `default` filter
2016-01-24 11:34:05 -05:00
Pat Hawks
7e322f5cf8 Performance improvement: default filter 2016-01-23 23:18:51 -08:00
Justin Li
bf86a5a069 Merge pull request #688 from Shopify/gmp
Install libgmp3-dev in travis
2016-01-23 21:46:37 -05:00
Justin Li
0141444814 Install libgmp3-dev in travis 2016-01-23 21:41:14 -05:00
Justin Li
6d30226768 Update changelog for 4.0.0rc1 2016-01-08 15:08:06 -05:00
Florian Weingarten
63e8bac1a4 meh 2016-01-08 20:00:45 +00:00
Florian Weingarten
8449849ed5 Merge pull request #682 from Shopify/4-pre-beta1
4.0.0.rc1
2016-01-08 20:59:59 +01:00
Florian Weingarten
4bc198a0db 4.0.0.rc1 2016-01-08 19:59:38 +00:00
Florian Weingarten
3921dbe919 Merge pull request #683 from Shopify/dropify-tablerowloop
Liquid::TablerowloopDrop
2016-01-08 20:41:54 +01:00
Florian Weingarten
79e2d1d8b4 Liquid::TablerowloopDrop 2016-01-08 18:46:23 +00:00
Florian Weingarten
b7c4041db8 Merge pull request #681 from Shopify/save-some-loop-allocations
Reuse 'forloop' hash to save memory allocations
2016-01-06 22:47:39 +01:00
Florian Weingarten
e113c891ec Convert forloop hash to drop 2016-01-06 21:30:32 +00:00
Guillaume Malette
a32ad449c0 Merge pull request #672 from Shopify/fix-proc-mapping
Test mapping over procs
2016-01-06 15:59:53 -05:00
Florian Weingarten
1662ba6679 Reuse 'forloop' hash to save memory allocations 2016-01-06 20:30:25 +00:00
Dylan Thacker-Smith
99b5e86f0a Merge pull request #680 from jcheatham/master
Ensure truncate is operating on a string
2015-12-23 18:41:39 -05:00
Jonathan Cheatham
b892a73463 Ensure truncate is operating on a string 2015-12-22 19:40:35 -08:00
Guillaume Malette
0b55d09cea Fix mapping over proc attributes 2015-11-20 13:04:42 -05:00
Dylan Thacker-Smith
5f8086572b Merge pull request #667 from Shopify/remove-empty-string-check
Remove nil and empty string check in invoke_drop.
2015-11-10 10:43:11 -05:00
Dylan Thacker-Smith
bdb9a4a47f Remove nil and empty string check in invoke_drop. 2015-11-09 15:03:36 -05:00
Dylan Thacker-Smith
c38eec0293 Merge pull request #665 from tanelj/escape_filter_nil_fix
Fixed issue where "nil" value for "escape" filter breaks rendering
2015-11-06 10:54:48 -05:00
Tanel Jakobsoo
8d5a907dc8 Fixed issue where "nil" value for "escape" filter breaks rendering
Closes #664
2015-11-06 16:32:02 +02:00
Florian Weingarten
74cc41ce74 Merge pull request #662 from nickpearson/keep-argument-error-backtrace
Keep original stack trace in Liquid::ArgumentError
2015-10-29 15:24:54 +01:00
Thierry Joyal
a120cc587a Merge pull request #661 from Shopify/rename-before-method-as-dynamic-method
Rename before_method as liquid_method_missing
2015-10-29 09:49:15 -04:00
Nick Pearson
c582023321 Keep original stack trace in Liquid::ArgumentError 2015-10-29 08:15:37 -05:00
Thierry Joyal
ac041c4ad1 Rename before_method as liquid_method_missing 2015-10-28 17:28:19 +00:00
Justin Li
31d7682f4e Update history to reflect merge of #658
[ci skip]
2015-10-21 12:50:12 -04:00
Justin Li
5f1acbc086 Merge pull request #658 from Shopify/url_decode-filter
Merge pull request 658
2015-10-21 12:49:14 -04:00
Justin Li
8612716129 Remove rescue in unescape filter 2015-10-21 02:01:21 -04:00
Larry Archer
e6392d1cc1 Tests for new url_decode filter 2015-10-21 01:58:22 -04:00
Larry Archer
04381418d3 Add url_decode filter to accompany url_encode 2015-10-21 01:58:22 -04:00
Justin Li
89ccdabe9a Merge pull request #655 from dijonkitchen/patch-1
Rename MIT-LICENSE to LICENSE
2015-10-14 12:08:37 -04:00
Jonathan Chen
c0fc6777b0 Rename MIT-LICENSE to LICENSE
Standard name format
2015-10-14 12:06:08 -04:00
Justin Li
cd03346239 Update history to reflect merge of #652
[ci skip]
2015-09-29 21:06:21 -04:00
Justin Li
b4f19da127 Merge pull request #652 from mcary/empty-array-sort
Merge pull request 652
2015-09-29 21:05:10 -04:00
Marcel M. Cary
4100f8d641 Fix "sort" filter on empty array to return empty array
When sorting an empty array with the "sort" filter, it returns nil
instead of [].  This confuses subsequent filters in the chain that
expect an array.  For example, when followed by the "map" filter, it
produces an array containing one nil element: [nil].

I could special-case the nil return value, but that would be more
cumbersome than making sure "sort" always returns an array.

Add a case to the "sort" method to return [] if the array is empty,
before performing any checks on ary.first that assume a non-empty array.

There is still a danger of returning nil if the first item in the array
is nil and it is non-empty, but I'm not sure how better to handle that
case.

Apply a similar fix to sort_natural, uniq, and compact filters.
2015-09-29 10:24:31 -07:00
Dylan Thacker-Smith
d8bda2c892 Merge pull request #653 from Shopify/fix-rubocop-offenses
Fix offenses from the new version of rubocop.
2015-09-25 19:48:09 -04:00
Dylan Thacker-Smith
4f81c0a658 Lock rubocop version to avoid CI failures from new releases. 2015-09-25 19:42:35 -04:00
Dylan Thacker-Smith
704937bc00 Fix offenses from the new version of rubocop. 2015-09-25 19:34:44 -04:00
Justin Li
27c6b8074a Update history to reflect merge of #610
[ci skip]
2015-08-03 20:51:41 -04:00
Justin Li
affae5ebef Merge pull request #610 from boobooninja/gf3
Merge pull request 610
2015-08-03 20:50:14 -04:00
Florian Weingarten
fc1c0d0d83 Merge pull request #632 from knu/fix_date_error
Properly rescue ::ArgumentError in the date filter
2015-07-24 10:50:52 -04:00
Akinori MUSHA
a215b70de9 Properly rescue ::ArgumentError in the date filter 2015-07-24 13:35:06 +09:00
Justin Li
1f70928f8a Update history to reflect merge of #631
[ci skip]
2015-07-23 17:07:40 -04:00
Justin Li
7713f6709d Update history for 3.0.5 2015-07-23 17:06:12 -04:00
Justin Li
239cf0e5f5 Update history for 2.6.3 2015-07-23 17:05:58 -04:00
Dylan Thacker-Smith
fa187665b3 Merge pull request #631 from Shopify/fix-tz-test-failure
Fix a timezone test failure.
2015-07-23 16:34:48 -04:00
Dylan Thacker-Smith
cd0c5e954c Fix a timezone test failure. 2015-07-23 16:19:59 -04:00
Florian Weingarten
490b457738 Merge pull request #626 from Shopify/fix_bracket_thing
Fix bracket thing
2015-07-17 17:19:06 +02:00
Florian Weingarten
4d6dec9b5a Fix chained access to multi-dimensional hash 2015-07-17 10:10:00 -04:00
Loren Hale
0b11b573d9 add global_filter
add a global filter using a proc
only add one proc and not an array
add tests to make sure the global_filter is applied after native filters
2015-07-12 16:46:43 +08:00
Justin Li
b42d35ff36 Merge pull request #620 from Shopify/accept-invalid-range-args
Add param to accept invalid input in to_integer
2015-07-09 13:24:28 -04:00
Justin Li
b4e133e26f Fix regression in range lookup 2015-07-09 13:21:46 -04:00
Justin Li
1f9bd1d809 Add param to accept invalid input in to_integer 2015-07-09 13:18:06 -04:00
Justin Li
e88be60818 Merge pull request #618 from Shopify/move-reraise-for-line-number
Move the syntax error rescue for adding error line numbers.
2015-07-09 11:42:41 -04:00
Dylan Thacker-Smith
14416b3c49 Move the syntax error rescue for adding error line numbers. 2015-07-09 11:25:05 -04:00
Dylan Thacker-Smith
bde14a650d Merge pull request #617 from Shopify/rename-options-iv
Rename options instance variable in Variable and Tag.
2015-07-08 20:50:20 -04:00
Dylan Thacker-Smith
c535af021a Rename options instance variable in Variable and Tag. 2015-07-08 19:59:44 -04:00
Dylan Thacker-Smith
9c9345869b Merge pull request #614 from Shopify/remove-token-class
Implement line numbers without the Liquid::Token class.
2015-07-08 19:48:55 -04:00
Dylan Thacker-Smith
73834a7e52 Use reject rather than dup and delete. 2015-07-08 19:27:24 -04:00
Dylan Thacker-Smith
c45310170b Use parse_context or options instead of @options. 2015-07-08 19:21:59 -04:00
Dylan Thacker-Smith
920e1df643 Rescue and re-raise syntax errors in Template#parse to add line numbers.
This can be done now that the parse context has the line number
information, so it doesn't need to be added on closer to the original
exception.  This has the advantage of not having to rescue and re-raise the
exception multiple times, and simplifies liquid-c which would otherwise
have to rescue the exception in BlockBody#parse.
2015-07-08 19:21:59 -04:00
Dylan Thacker-Smith
cebf75b8d7 Implement line numbers without the Liquid::Token class. 2015-07-08 19:21:59 -04:00
Justin Li
afda01adbb Merge pull request #616 from Shopify/handle-non-int-range-args
Handle non-int range lookup arguments
2015-07-08 17:47:27 -04:00
Justin Li
959cd6d2a2 Temporarily disable rubinius in CI
It takes much longer than the others and is currently broken
2015-07-08 17:47:05 -04:00
Justin Li
4c1b89e20e Add regression test for ranges on non-integer types 2015-07-08 17:41:18 -04:00
Justin Li
83b6dd0268 Use to_integer for range lookup arguments 2015-07-08 17:37:07 -04:00
Justin Li
6fb402e60d Move to_integer, to_date, and to_number to Liquid::Utils 2015-07-08 17:33:05 -04:00
Dylan Thacker-Smith
338287df5e Merge pull request #613 from Shopify/taint-context-warning
Add taint warnings to the context rather than the template.
2015-07-07 16:23:10 -04:00
Dylan Thacker-Smith
c4c398174b Use early returns rather than large if in Variable#taint_check 2015-07-07 15:56:03 -04:00
Dylan Thacker-Smith
80b6ac3bc7 Add taint warnings to the context rather than the template. 2015-07-07 15:53:02 -04:00
Dylan Thacker-Smith
15974d9168 Merge pull request #612 from Shopify/fix-block-body-naming
Use node to refer to objects from the nodelist rather than token.
2015-07-07 15:49:58 -04:00
Dylan Thacker-Smith
f22ab4358b Merge pull request #611 from Shopify/no-escape-rescue
Remove standard exception rescue in escape filter.
2015-07-07 15:49:43 -04:00
Justin Li
9cf0d264e1 Require RuboCop v0.32.0 or later 2015-07-06 15:58:36 -04:00
Justin Li
575e3cae7a Remove class length metric cop 2015-07-06 15:52:11 -04:00
Dylan Thacker-Smith
fad3b8275c Use node to refer to objects from the nodelist rather than token. 2015-07-04 20:57:35 -04:00
Dylan Thacker-Smith
5a071cb7f2 Remove standard exception rescue in escape filter. 2015-07-04 13:48:25 -04:00
Justin Li
8cb2364179 Merge pull request #608 from Shopify/tag-tag_name
Add Liquid::Tag#tag_name
2015-07-02 16:28:37 -04:00
Gaurav Chande
3c23cfc167 Add Liquid::Tag#tag_name 2015-07-02 20:18:09 +00:00
Justin Li
8a8de46c6a Merge pull request #603 from Shopify/format-history
Format changelog attribution to include one name only
2015-06-23 07:40:05 -07:00
Justin Li
58c7f226cc Format changelog attribution to include one name only 2015-06-19 11:45:37 -04:00
Justin Li
adfcd0ab13 Update history to reflect merge of #600
[ci skip]
2015-06-19 11:38:59 -04:00
Justin Li
30ef7d14b0 Merge pull request #600 from carsonreinke/filter-compact
Merge pull request 600
2015-06-19 11:38:14 -04:00
Florian Weingarten
4920ec50e4 update changelog 2015-06-19 07:41:39 -04:00
David Cornu
e395229283 Merge pull request #601 from Shopify/safe-to-integer
Use to_integer instead of to_i on arguments
2015-06-16 11:31:20 -04:00
David Cornu
9470fba0c8 Exclude lib/liquid/standardfilters.rb from ModuleLength 2015-06-16 15:19:06 +00:00
David Cornu
ac180e8402 Use to_integer instead of to_i on arguments 2015-06-16 15:08:29 +00:00
Carson Reinke
7c5d54aced Ignore Rubocop Metrics/ModuleLength for now 2015-06-15 15:07:25 -04:00
Carson Reinke
5fbb312a67 "Trailing whitespace detected." 2015-06-15 14:27:48 -04:00
Carson Reinke
8385099960 Added "compact" filter 2015-06-15 14:14:28 -04:00
Florian Weingarten
504b6fb3c7 Merge pull request #596 from Shopify/liquid_c_tests
Run tests with latest liquid/c gem
2015-06-08 22:52:57 +02:00
Florian Weingarten
01420e8014 fix gem platforms 2015-06-08 18:38:40 +00:00
Florian Weingarten
dde35a2907 shut up rubocop 2015-06-08 18:38:40 +00:00
Florian Weingarten
e2323332cd Run tests with latest liquid/c gem 2015-06-08 18:38:35 +00:00
Florian Weingarten
7b4398d0c4 Merge pull request #595 from Shopify/uniq_on_strings
Fix uniq filter with string input
2015-06-05 16:27:05 +02:00
Florian Weingarten
1e23036b2d Fix uniq filter with string input 2015-06-04 22:55:03 -04:00
Florian Weingarten
13716fa68b Merge pull request #594 from boobooninja/rake_console
add rake console
2015-06-05 04:21:01 +02:00
Loren Hale
232e8bb4cd add rake console
add Rake console task to load irb with liquid
2015-06-05 10:17:55 +08:00
Dylan Thacker-Smith
6968def5dd Merge pull request #574 from Shopify/template-name-in-errors
Include template name with line numbers in render errors.
2015-06-04 15:28:12 -04:00
Dylan Thacker-Smith
ad3748af21 Include template name with line numbers in render errors. 2015-06-04 13:44:01 -04:00
Florian Weingarten
c82e04f4e6 Merge pull request #593 from Shopify/fix_predicate_name
Rename 'has_key?' and 'has_interrupt?'
2015-06-04 19:40:14 +02:00
Florian Weingarten
5919626da4 Rename 'has_key?' and 'has_interrupt?' 2015-06-04 13:14:46 -04:00
Florian Weingarten
82269e2509 fix a few more rubocop offenses 2015-06-04 13:09:58 -04:00
Florian Weingarten
b347fac3c0 Merge pull request #592 from Shopify/method_literal
blank and empty as variable names
2015-06-04 19:09:48 +02:00
Florian Weingarten
e761a6864e clean up some rubocop stuff 2015-06-04 12:56:29 -04:00
Florian Weingarten
4c22cef341 blank and empty as variable names 2015-06-04 12:30:50 -04:00
Florian Weingarten
c319240174 run rubocop on CI 2015-06-04 11:57:25 -04:00
Florian Weingarten
6ace095207 Avoid parallel assignments 2015-06-04 11:56:47 -04:00
Florian Weingarten
e36f366c33 gitignore .bundle 2015-06-04 11:56:00 -04:00
Florian Weingarten
02729e89c0 make rubocop happy 2015-06-04 11:56:00 -04:00
Gaurav Chande
6b0f6401d0 Merge pull request #590 from Shopify/allow-template-tags
Local Tags
2015-06-04 11:19:24 -04:00
Gaurav Chande
fc8e6c8d3a Change Tokenizer test to fetch tokens instead of exposing ivar 2015-06-04 15:10:01 +00:00
Gaurav Chande
79d7dd06df Extract tag fetching into a method (which can be overriden then) 2015-06-04 04:39:54 +00:00
Gaurav Chande
3a907a4db7 Move DEFAULT_OPTIONS related logic to Document 2015-06-04 04:39:54 +00:00
Gaurav Chande
8b98f92c7f Extract tokenize logic from Template to a RubyTokenizer 2015-06-04 04:39:30 +00:00
Dylan Thacker-Smith
b79c0c611c Merge pull request #586 from Shopify/string-contains-non-string
Avoid an exception from checking if a string contains a non-string.
2015-06-03 10:58:38 -04:00
Dylan Thacker-Smith
8a2947865b Avoid an exception from checking if a string contains a non-string. 2015-06-03 02:21:51 -04:00
Dylan Thacker-Smith
ea29f8b4b8 Merge pull request #583 from Shopify/slice-nil-offset
Raise a Liquid::ArgumentError in slice filter for invalid integers.
2015-06-03 01:43:56 -04:00
Dylan Thacker-Smith
c84f4520cc Keep input out of error message and add test for slice Integer parsing. 2015-06-03 01:35:01 -04:00
Dylan Thacker-Smith
3dd6433e2f Merge pull request #584 from Shopify/replace-non-string
Convert arguments to replace filters to strings to avoid exceptions.
2015-06-02 16:41:15 -04:00
Dylan Thacker-Smith
ab7109a335 Raise a Liquid::ArgumentError in slice filter for invalid integers. 2015-06-02 16:05:08 -04:00
Dylan Thacker-Smith
94fe050952 Convert arguments to replace filters to strings to avoid exceptions. 2015-06-02 15:59:29 -04:00
Justin Li
9b98c436c4 Merge pull request #582 from Shopify/require-empty-raw-tag
Ensure raw tag has no arguments
2015-06-02 15:58:15 -04:00
Justin Li
889019f53a Keep old test as well 2015-06-02 15:21:51 -04:00
Justin Li
c290375aec Remove unnecessary regex options 2015-06-02 15:17:36 -04:00
Justin Li
719a98a25e Ensure raw tag has no arguments 2015-06-02 14:32:39 -04:00
Justin Li
86d8b552da Merge pull request #581 from Shopify/require-closed-raw-tag
Raise SyntaxError if raw tag is unclosed
2015-06-02 11:38:45 -04:00
Justin Li
b1ee9129e7 Raise SyntaxError if raw tag is unclosed 2015-06-02 10:56:51 -04:00
Justin Li
be2e41e4d5 Merge pull request #579 from Shopify/ast-match
Ensure For@reversed is a boolean
2015-05-28 16:45:09 -04:00
Justin Li
20ca2b9632 Update history to reflect merge of #570
[ci skip]
2015-05-28 16:43:22 -04:00
Justin Li
6c058823ad Merge pull request #570 from Shopify/fix-strict-conditions
Fix condition parse order in strict mode
2015-05-28 16:33:54 -04:00
Dylan Thacker-Smith
27245c9eab Merge pull request #577 from Shopify/table-row-blank-string-collection
Fix exception from using an empty string for the table row collection.
2015-05-28 16:20:42 -04:00
Justin Li
a639a13380 Use cleaner recursive solution 2015-05-28 16:16:30 -04:00
Justin Li
05a0fe56c8 Ensure For@reversed is a boolean 2015-05-28 16:09:26 -04:00
Dylan Thacker-Smith
c1eb694057 Remove the redundant iterable check in the for tag.
Just do it in slice_collection for consistency with the tablerow tag.
2015-05-28 16:04:50 -04:00
Dylan Thacker-Smith
f53b31c867 Merge pull request #578 from Shopify/filter-error-handling
Handle some more standard filter errors.
2015-05-28 15:00:57 -04:00
Dylan Thacker-Smith
363388e92f Handle some more standard filter errors. 2015-05-28 14:18:53 -04:00
Dylan Thacker-Smith
873eddbb85 Split a line and use String#empty? for readability 2015-05-28 12:55:04 -04:00
Dylan Thacker-Smith
e790b60f60 Fix exception from using an empty string for the table row collection. 2015-05-28 12:11:39 -04:00
Dylan Thacker-Smith
3264d60425 Merge pull request #576 from Shopify/flexible-exception-handler
Allow the exception handler to convert exceptions to hide error messges
2015-05-28 11:38:44 -04:00
Dylan Thacker-Smith
8ff1b8e01f Test set_line_number_from_token after exception is converted. 2015-05-28 09:22:02 -04:00
Dylan Thacker-Smith
8d5e71f856 Allow the exception handler to convert exceptions to hide error messages. 2015-05-27 18:59:51 -04:00
Dylan Thacker-Smith
89c6e605f8 Merge pull request #575 from Shopify/zero-division-error
Raise Liquid::ZeroDivisionError instead of ZeroDivisionError.
2015-05-26 10:43:23 -04:00
Dylan Thacker-Smith
6265c36ec9 Raise Liquid::ZeroDivisionError instead of ZeroDivisionError. 2015-05-25 15:40:17 -04:00
Dylan Thacker-Smith
8af99ff918 Merge pull request #573 from Shopify/optional-error-rendering
Make liquid error rendering optional.
2015-05-25 12:11:10 -04:00
Dylan Thacker-Smith
36200ff704 Make liquid error rendering optional.
Although the author of the liquid template wants to see these errors, they
probably don't want the visitor to see the liquid errors.  Probably the
best fallback when rendering the page for visitors is to render the empty
string for tags with errors.
2015-05-25 11:24:53 -04:00
Justin Li
a9c7df931f Strict parse conditions in reverse order 2015-05-19 11:51:01 -04:00
Justin Li
070639daba Push to for_stack at the beginning of For#render 2015-05-15 23:13:15 -04:00
Justin Li
dad98cfc89 Merge pull request #562 from Shopify/use-find_variable-for-parentloop
Use custom stack for forloop references
2015-05-15 21:48:57 -04:00
Florian Weingarten
1d3c0b3dab Merge pull request #568 from Shopify/remove_liquid_methods
Remove support for `liquid_methods` Module extension
2015-05-14 22:19:02 +02:00
Justin Li
648a4888af Pop the for_stack register in an ensure 2015-05-14 15:02:20 -04:00
Justin Li
b4e5017c79 Add truth table test for multiple if conditions 2015-05-14 14:11:03 -04:00
Justin Li
f1bc9f27df Include message in assert_template_result 2015-05-14 14:10:45 -04:00
Florian Weingarten
f4724f0db3 Remove support for liquid_methods Module extension 2015-05-14 14:44:19 +00:00
Florian Weingarten
df74955ac4 Merge pull request #564 from Shopify/rubocop
Rubocop
2015-05-14 16:41:32 +02:00
Florian Weingarten
3372ca8136 Rubocop 2015-05-14 14:37:18 +00:00
Jean Boussier
8cf524e91c Merge pull request #565 from Shopify/file-dirname
Modernize code base with __dir__ and require_relative
2015-05-13 15:45:22 -04:00
Jean Boussier
5e38626309 Force circle in ruby 2.0 2015-05-13 15:40:34 -04:00
Jean Boussier
b31df0fb3d Mordernize code base with __dir__ and require_relative 2015-05-13 15:33:00 -04:00
Florian Weingarten
9e815ec594 Merge pull request #563 from Shopify/webscale_exceptions
Prefer Class.new() where possible
2015-05-13 06:06:35 +02:00
Florian Weingarten
93b29b67ef Prefer Class.new() where possible 2015-05-13 02:47:43 +00:00
Justin Li
863e8968f0 Use extra stack for forloop references 2015-05-12 17:04:34 -04:00
Justin Li
4c9d2009f9 Add find_own_variable method to look up internal context variables 2015-05-12 16:49:39 -04:00
Justin Li
239cfa5a44 Use find_variable for parentloop 2015-05-12 16:11:32 -04:00
Justin Li
8a8996387b Update history to reflect merge of #554
[ci skip]
2015-05-12 13:20:06 -04:00
Justin Li
9310640bdd Merge pull request #554 from arthanzel/529-sort_natural
Merge pull request 554
2015-05-12 13:19:24 -04:00
Justin Li
4c3381a523 Update history to reflect merge of #559
[ci skip]
2015-05-12 10:59:58 -04:00
Justin Li
261aa2e726 Merge pull request #559 from Shopify/fix-include-var
Merge pull request 559
2015-05-12 10:50:13 -04:00
Justin Li
247c51ac70 Call Context#find_variable directly 2015-05-11 18:22:15 -04:00
Justin Li
37dbec3610 Remove unnecessary parse 2015-05-11 18:10:38 -04:00
Justin Li
ff253a04c6 Lazily evaluate template name for context variable injection 2015-05-11 18:01:24 -04:00
Justin Li
25ef0df671 Add tests for #461 2015-05-11 17:59:05 -04:00
Martin Hanzel
32460c255b Removed a few superfluous comments 2015-05-08 11:48:33 -04:00
Justin Li
724d625f47 Update history to reflect merge of #555 [ci skip] 2015-05-07 14:03:38 -04:00
Justin Li
f658dcee8b Merge pull request #555 from boobooninja/date_filter
Merge pull request 555
2015-05-07 13:59:22 -04:00
Loren Hale
fa6cd6287e date filter gracefully accepts empty string 2015-05-07 17:04:21 +08:00
Justin Li
76c24db039 Remove ruby-head from allowed failures 2015-05-05 12:49:04 -04:00
Martin Hanzel
068791d698 Added method parens 2015-05-05 11:49:14 -04:00
Martin Hanzel
3a082ddbbd Changed sort_natural filter to use casecmp. Strings only. 2015-05-04 11:55:14 -04:00
Martin Hanzel
03b3446119 Resolves #529. Resolves #404. Added natural sorting filter and tests. 2015-05-03 20:55:28 -04:00
James Reid-Smith
251ce7483c Merge pull request #441 from Shopify/remove_context_from_read_template_file
Removed context from read_template_file, fixed tests to match new arity
2015-04-27 12:13:36 -04:00
James Reid-Smith
4592afcc8b Updated History.md and removed a couple remaining methods using the old signature 2015-04-27 15:45:44 +00:00
James Reid-Smith
448766b0c4 Removed context from read_template_file, fixed tests to match new arity 2015-04-27 15:27:03 +00:00
Justin Li
6390652c3f Update changelog with backported patches 2015-04-24 16:09:37 -04:00
Justin Li
f266aee2e5 Slightly more concise issue# reference in changelog 2015-04-21 23:40:42 -04:00
Justin Li
df0649a031 Update changelog 2015-04-21 23:36:54 -04:00
Justin Li
78a5972487 Merge pull request #541 from Shopify/history-sync
Sync History.md for Liquid 4
2015-04-21 23:34:29 -04:00
Justin Li
298ae3357c Merge pull request #551 from Shopify/expose-variable-name
Merge pull request 551
2015-04-21 23:33:13 -04:00
Justin Li
f1f3f57647 Remove command_lookups reader 2015-04-21 00:25:51 -04:00
Justin Li
e5dd63e1fc Expose name, lookups, and command flags from VariableLookup 2015-04-20 17:36:04 -04:00
Justin Li
881f86d698 Merge pull request #550 from Shopify/minitest-fail-workaround
Disable minitest expectation interface due to reckless modification of Object
2015-04-20 10:22:19 -04:00
Justin Li
a1b209d212 Disable minitest expectation interface due to reckless modification of Object 2015-04-20 10:15:19 -04:00
Thierry Joyal
8e5926669b Merge pull request #545 from Shopify/explode-invokable_methods-on-drop
Explode invokable_methods method on Liquid::Drop
2015-04-02 09:02:48 -07:00
Thierry Joyal
8736b602ea Explode invokable_methods method on Liquid::Drop 2015-04-02 13:16:07 +00:00
Justin Li
b8365af07d Add changes for 4.0.0 2015-03-25 14:53:43 -04:00
Justin Li
53842a471e Create history section for 4.0.0 2015-03-25 14:40:19 -04:00
Justin Li
86a82d3039 Merge pull request #540 from Shopify/array-concat
Add array concat filter
2015-03-25 01:42:22 -04:00
Justin Li
2b78e74b4e Add test for concat filter with non-array input 2015-03-25 01:34:47 -04:00
divecch
db396dd739 adding concat filter to append arrays 2015-03-25 01:31:22 -04:00
Justin Li
3213db54d6 Merge pull request #520 from Shopify/forloop-parentloop
Add forloop.parentloop as a reference to the parent loop
2015-03-25 01:22:35 -04:00
Justin Li
97a3f145a1 Merge pull request #499 from kreynolds/to_date_downcase_regression
Fix case sensitivity regression in date standard filter
2015-03-25 01:22:04 -04:00
Florian Weingarten
2fbe813770 Merge pull request #539 from Dorian/patch-1
Update module_ex.rb code documentation and code style
2015-03-24 15:21:22 +01:00
Dorian Marié
23a23c6419 Update module_ex.rb code documentation and code style
Didn't look good on rubydoc.info: http://i.imgur.com/469N92P.png
2015-03-24 14:09:08 +01:00
Dylan Thacker-Smith
63eb1aac69 Merge pull request #519 from Shopify/remove-filter-method-blacklist
Allow filters to redefine Object methods to make them invokable.
2015-02-04 18:07:51 -05:00
Justin Li
205bd19d3f Add forloop.parentloop as a reference to the parent loop 2015-02-04 12:43:09 -05:00
Dylan Thacker-Smith
950f062041 Allow filters to redefine Object methods to make them invokable. 2015-02-03 13:51:33 -05:00
Tobias Lütke
3476a556dd Merge pull request #512 from Shopify/fix_tobi_name
Fix Tobi last name on gemspec
2015-01-23 21:24:04 -05:00
Arthur Neves
d2ef9cef10 master is 4.0.0 2015-01-23 10:49:07 -05:00
Arthur Neves
0021c93fef Add ruby 2.2 to travis
and allow failure on ruby head
2015-01-23 10:42:26 -05:00
Arthur Neves
dcf7064460 Fix Tobi last name on gemspec 2015-01-23 10:21:40 -05:00
Florian Weingarten
bebd3570ee Merge pull request #506 from Shopify/fix_capture_with_hyphen
Use VariableSignature as Syntax for Capture tag to allow hyphens in variable names
2015-01-10 23:27:00 -05:00
Florian Weingarten
7cfee1616a Use VariableSignature as Syntax for Capture tag to allow hyphens in variable names 2015-01-09 14:15:26 +00:00
Arthur Nogueira Neves
4b0a7c5d1d Merge pull request #504 from alfredxing/duplicate-keys
Remove duplicate `index0` key in TableRow tag
2014-12-30 13:15:10 -05:00
Alfred Xing
5df1a262ad Remove duplicate key in hash 2014-12-25 12:12:42 -08:00
Kelley Reynolds
84fddba2e1 Remove regex for downcase and is_a?(String) 2014-12-18 13:01:23 -05:00
Kelley Reynolds
8b0774b519 Fix case sensitivity regression in date standard filter 2014-12-16 10:37:05 -05:00
Justin Li
e2f8b28f56 Merge pull request #492 from Shopify/resource-counting-perf
Resource counting perf
2014-12-11 16:05:41 -05:00
Justin Li
3080f95a4f Make render_length tests stricter 2014-12-11 10:41:47 -05:00
Justin Li
cc57908c03 Add test for render_length persisting between block bodies 2014-12-11 10:38:47 -05:00
Justin Li
4df4f218cf Use same template instance 2014-12-09 17:25:15 -05:00
Justin Li
c2f71ee86b Reset resource consumption before each render 2014-12-09 17:23:07 -05:00
Justin Li
9f7e601110 Convert render output to strings in BlockBody 2014-12-05 15:17:09 -05:00
Justin Li
3755031c18 Merge pull request #485 from Shopify/lazy-load-profiler-hooks
Defer loading profiler hooks
2014-12-05 15:10:16 -05:00
Justin Li
b628477af1 Disambiguate checking if Liquid::Profiler is defined 2014-12-04 17:51:54 -05:00
Justin Li
dd455a6361 Force user to require the profiler themselves 2014-12-04 17:48:26 -05:00
Justin Li
8c70682d6b Don't automatically load hooks 2014-12-04 17:39:41 -05:00
Justin Li
742b3c69bb Remove commented code 2014-12-04 16:30:37 -05:00
Justin Li
1593b784a7 Simplify interface for setting template resource limits 2014-12-04 16:18:21 -05:00
Justin Li
db00ec8b32 Move resource limit tracking to its own class 2014-12-04 16:18:09 -05:00
Justin Li
3ca40b5dea Merge pull request #491 from Shopify/drop-ruby-1-9
Drop Ruby 1.9 from CI, add Ruby head
2014-12-03 12:52:10 -05:00
Justin Li
378775992f Drop Ruby 1.9 from CI, add Ruby head 2014-12-02 14:33:51 -05:00
Florian Weingarten
319400ea23 Merge pull request #489 from alex-ross/patch-1
Fixes syntax error in documentation for unless tag
2014-11-19 14:02:58 +01:00
Alexander Ross
289a03f9d7 Fixes syntax error in documentation for unless tag 2014-11-19 10:49:58 +01:00
Justin Li
a0710f4c70 Merge pull request #486 from Shopify/fix-exponential-warnings
Fix #warnings taking exponential time to compute
2014-11-12 17:22:16 -05:00
Justin Li
737be1a0c1 Use Timeout#timeout for warnings tests 2014-11-12 17:03:48 -05:00
Justin Li
1673098126 Handle potential case where warnings returns nil 2014-11-12 16:46:10 -05:00
Justin Li
422bafd66a Fix #warnings taking exponential time to compute 2014-11-12 16:12:00 -05:00
Justin Li
c0aab820ed Lazily load profiler hooks 2014-11-12 00:05:01 -05:00
Florian Weingarten
3321cffe08 Merge pull request #482 from joshk/patch-1
Use the new beta build env on Travis
2014-11-07 03:06:52 +01:00
Josh Kalderimis
f2772518b0 Use the new beta build env on Travis
job start in seconds, instead of 20-120 seconds
2014-11-07 14:54:21 +13:00
Justin Li
76ef675eb2 Merge pull request #481 from Shopify/fix-nil-blank
Coerce regex @blank output to a boolean
2014-11-06 13:03:15 -05:00
Justin Li
e5fd4d929f Coerce regex @blank output to a boolean 2014-11-05 20:44:06 -05:00
Justin Li
2e42c7be1f Merge pull request #480 from Shopify/number_variables
Add quirks test for variables with number prefixes
2014-11-05 12:05:21 -05:00
Justin Li
95b031ee04 Add quirks test for extra dots in ranges 2014-11-05 11:41:12 -05:00
Justin Li
4d97a714a9 Add quirks test for variables with number prefixes 2014-11-05 10:56:58 -05:00
Justin Li
aa182f64b4 Merge pull request #479 from Shopify/tweaks-for-c
Tweaks for C
2014-11-04 14:02:14 -05:00
Justin Li
4e870302b1 Add env var for saving stackprof graphviz output 2014-11-04 18:38:14 +00:00
Justin Li
098c89b5f5 Convenience methods for raising terminator syntax errors 2014-11-04 18:38:08 +00:00
Justin Li
70c45f8cd8 Use SVG badge URLs
[ci skip]
2014-11-03 17:41:42 -05:00
Justin Li
12d526a05c Merge pull request #458 from Shopify/block-body
Create a BlockBody class to decouple block body parsing from tags.
2014-11-03 17:34:39 -05:00
Dylan Thacker-Smith
2fd8ad08c0 Remove unused local variable that was accidentally added. 2014-11-03 17:07:42 -05:00
Dylan Thacker-Smith
15e1d46125 Avoid storing options instance variable in BlockBody.
There is no need to pass parse options to the BlockBody initializer, since
it does all the parsing in the parse method, unlike tags which parse the
tag markup in the initializer.
2014-11-03 17:07:42 -05:00
Dylan Thacker-Smith
73fcd42403 Create a BlockBody class to decouple block body parsing from tags. 2014-11-03 17:07:42 -05:00
Justin Li
263e90e772 Merge pull request #478 from Shopify/numbers-in-identifiers
Use a single token for identifiers
2014-10-30 21:59:26 -04:00
Justin Li
81770f094d Remove unnecessary + 2014-10-29 13:39:43 -04:00
Justin Li
dd5ee81089 Disallow number and dash identifier prefixes 2014-10-29 12:08:00 -04:00
Justin Li
a07e382617 Use a single token for identifiers 2014-10-29 11:28:41 -04:00
Justin Li
4dc682313f Merge pull request #476 from Shopify/missing-variable-name-error
Disallow filters with no variable in strict mode
2014-10-27 13:56:11 -04:00
Justin Li
5616ddf00e Remove obsolete comment 2014-10-27 13:44:14 -04:00
Justin Li
fcb23a4cd2 Disallow filters with no variable in strict mode 2014-10-27 13:34:27 -04:00
Justin Li
a8f60ff6b1 Merge pull request #472 from Shopify/fix-leaky-test
Fix test leaking error_mode, fix equality check for VariableLookup
2014-10-23 10:12:41 -04:00
Justin Li
a206c8301d Fix test leaking error_mode, fix equality check for VariableLookup 2014-10-22 15:40:41 -04:00
Justin Li
ee0de01480 Merge pull request #469 from Shopify/falsy-variable-fix
Fix case where a variable name is falsy
2014-10-21 15:06:34 -04:00
Justin Li
887b05e6ed Clarify test name 2014-10-21 14:06:30 -04:00
Justin Li
5d68e8803f Ensure nil works as a variable name 2014-10-21 14:03:10 -04:00
Justin Li
dedd1d3dc0 Fix case where a variable name is falsy 2014-10-21 12:09:26 -04:00
Dylan Thacker-Smith
d9ae36ec40 Merge pull request #466 from Shopify/remove-expression-cache
Remove expression cache
2014-10-20 13:57:17 -04:00
Dylan Thacker-Smith
b9ac3fef8f Remove the quotes from the partial string in the profiler timing objects. 2014-10-18 16:26:18 -04:00
Dylan Thacker-Smith
f5faa4858c Remove parsed expression cache. 2014-10-18 15:03:40 -04:00
Dylan Thacker-Smith
bc5e444d04 Use Expression.parse and Context#evaluate in the Include class. 2014-10-18 15:03:40 -04:00
Dylan Thacker-Smith
3a4b63f37e Use Expression.parse and Context#evaluate in the TableRow class. 2014-10-18 15:03:40 -04:00
Dylan Thacker-Smith
a1a128db19 Refactor Condition so that it takes a parsed expression. 2014-10-18 15:03:40 -04:00
Dylan Thacker-Smith
d502b9282a Use Expression.parse and Context#evaluate in the For class. 2014-10-18 15:03:36 -04:00
Dylan Thacker-Smith
fee8e41466 Use Expression.parse and Context#evaluate in the Cycle class. 2014-10-18 14:27:58 -04:00
Dylan Thacker-Smith
37260f17ff Use Expression.parse and Context#evaluate in the Condition class. 2014-10-18 14:27:58 -04:00
Florian Weingarten
2da9d49478 Merge pull request #465 from Shopify/avoid_multi_assigns
Avoid parallel assignments
2014-10-18 16:19:02 +02:00
Florian Weingarten
7196a2d58e Avoid parallel assignments 2014-10-18 13:58:32 +00:00
Justin Li
a056f6521c Merge pull request #463 from Shopify/stricter-identifiers
Separate ? and - into special tokens
2014-10-17 13:45:48 -04:00
Justin Li
de16db9b72 Don't allow - to end a variable name 2014-10-17 13:38:07 -04:00
Justin Li
b4ea483c4e Separate ? and - into special tokens 2014-10-17 13:30:54 -04:00
Justin Li
7843bcca8d Merge pull request #443 from Shopify/completely-parse-variables
Parse expressions in Liquid::Variable#parse.
2014-10-17 13:12:46 -04:00
Florian Weingarten
76ea5596ff Merge pull request #462 from Shopify/flat_map
nodelist flat_map over map.flatten
2014-10-17 18:32:00 +02:00
Florian Weingarten
f9318e8c93 flat_map 2014-10-17 16:11:12 +00:00
Florian Weingarten
71253ec6f9 Merge pull request #459 from Shopify/pop_vs_shift
Use pop over shift to avoid reverse
2014-10-15 21:42:53 +02:00
Florian Weingarten
0fa075b879 Use pop over shift to avoid reverse 2014-10-15 19:26:39 +00:00
Dylan Thacker-Smith
6d080afd22 Merge pull request #446 from Shopify/remove-end-tag
Remove unused Block#end_tag method.
2014-10-14 03:03:31 -04:00
Dylan Thacker-Smith
a67e2a0a00 Remove unused Block#end_tag method.
Although the method is called, it is defined with an empty body and not
overridden to do anything else.
2014-10-14 02:58:11 -04:00
Dylan Thacker-Smith
f387508666 Parse expressions in Liquid::Variable#parse. 2014-10-08 21:06:59 -04:00
Florian Weingarten
632b1fb702 Merge pull request #455 from Shopify/parse_error_line_numbers
Line numbers for all parse errors
2014-10-04 17:53:30 +02:00
Dylan Thacker-Smith
d84870d7a5 Test line number of errors in nested blocks. 2014-10-03 16:25:12 -05:00
Florian Weingarten
584b492e70 Line numbers for all parse errors 2014-10-03 21:00:31 +00:00
Dylan Thacker-Smith
b79c9cb9bf Merge pull request #453 from Shopify/no-modify-default-resource-limit
Avoid modifying the default resources limits hash.
2014-10-01 19:02:09 -05:00
Dylan Thacker-Smith
cf5ccede50 Avoid modifying the default resources limits hash. 2014-10-01 18:51:06 -05:00
Evan Huus
23622a9739 Merge pull request #440 from Shopify/drop-tainting
Variable tainting
2014-09-22 13:43:35 -04:00
Florian Weingarten
7ba5a6ab75 Merge pull request #450 from Shopify/additional_test_for_includes
Regression test for including assignments
2014-09-18 21:05:37 +02:00
Florian Weingarten
be3d261e11 Regression test for including assignments 2014-09-18 10:37:44 +00:00
Evan Huus
eeb061ef44 Address code review comments
- clean up comment wording
- fix potentially leaky tests
2014-09-16 17:23:26 +00:00
Evan Huus
67b2c320a1 Add tainting tests 2014-09-16 17:23:26 +00:00
Evan Huus
1d151885be Auto-untaint variables passed through 'escape' 2014-09-16 17:23:26 +00:00
Evan Huus
e836024dd9 Check and handle when a tainted variable is used 2014-09-16 17:23:26 +00:00
Dylan Thacker-Smith
638455ed92 Merge pull request #448 from Shopify/remove-unused-filter-not-found-error
Remove Liquid::FilterNotFoundError since it is never raised.
2014-09-15 17:43:33 -04:00
Dylan Thacker-Smith
b2a74883e9 Remove Liquid::FilterNotFoundError since it is never raised. 2014-09-15 17:42:07 -04:00
Dylan Thacker-Smith
6875e5e16f Merge pull request #449 from Shopify/fix-flaky-total-render-time-test
Fix flaky test which assumes total_render_time can't be 0.
2014-09-15 17:41:41 -04:00
Dylan Thacker-Smith
a5717a3f8d Fix flaky test which assumes total_render_time can't be 0.
jruby has millisecond precision for Time.now, so total_render_time can be 0
due to this lack of precision.
2014-09-15 17:26:55 -04:00
Dylan Thacker-Smith
804fcfebd1 Merge pull request #444 from Shopify/remove-block-children
Avoid keeping track of two lists of nodes during parsing.
2014-09-15 09:56:08 -04:00
Dylan Thacker-Smith
b37ee5684a Merge pull request #445 from Shopify/prefer-super-over-render-all
Use super rather than render_all in single block render classes.
2014-09-15 09:53:54 -04:00
Dylan Thacker-Smith
0573b63b4c Use super rather than render_all in single block render classes. 2014-09-12 16:58:07 -04:00
Dylan Thacker-Smith
29c21d7867 Avoid keeping track of two lists of nodes during parsing. 2014-09-12 16:43:00 -04:00
Dylan Thacker-Smith
478eb893a9 Merge pull request #439 from Shopify/default-resource-limits
Make it easy to set default resource limits.
2014-09-11 14:27:52 -04:00
Dylan Thacker-Smith
eae29f8c48 Make it easy to set default resource limits. 2014-09-11 13:54:30 -04:00
Florian Weingarten
4004cb63a5 Merge pull request #419 from Shopify/liquid_error_line_numbers
Optional line numbers for liquid errors
2014-09-08 23:15:53 +02:00
Jason Hiltz-Laforge
aafdf4adb0 Fix JRuby builds 2014-09-08 20:41:22 +00:00
Florian Weingarten
debac5dd0b Revert "move line number check"
This reverts commit 939365c234.

Conflicts:
	lib/liquid/template.rb
2014-09-06 10:21:17 -04:00
Florian Weingarten
ce06ed4bb1 merge conflicts 2014-09-05 14:16:20 +00:00
Florian Weingarten
939365c234 move line number check 2014-09-05 14:12:30 +00:00
Florian Weingarten
c60fd0715d remove unnecessary nil 2014-09-05 14:12:30 +00:00
Florian Weingarten
c83e1c7b6d prefix for Liquid::Error instances 2014-09-05 14:12:30 +00:00
Florian Weingarten
aabbd8f1a1 remove unnecessary method 2014-09-05 14:12:30 +00:00
Florian Weingarten
60d8a213a5 Clean up Liquid::Error#render 2014-09-05 14:12:30 +00:00
Florian Weingarten
17cc8fdbb3 put line number in parentheses 2014-09-05 14:12:30 +00:00
Tristan Hume
27c1019385 Add line numbers to warnings 2014-09-05 14:12:30 +00:00
Tristan Hume
3a0ee6ae91 Remove parser switching duplication 2014-09-05 14:12:29 +00:00
Florian Weingarten
5eff375094 Optional line numbers for liquid errors 2014-09-05 14:12:29 +00:00
Tristan Hume
2df643ba18 Merge pull request #425 from Shopify/pass-options-include
Pass options through on include
2014-08-26 13:40:06 -04:00
Tristan Hume
68af2d6e2a Pass options to include tags 2014-08-26 10:50:25 -04:00
Arthur Nogueira Neves
dfb6c20493 Merge pull request #423 from bogdan/contains-with-integer
Fixed condition constains operator with wrong data type
2014-08-18 14:58:08 -04:00
Bogdan Gusiev
4e9d414fde Fixed condition constains operator with wrong data type
"contains" operator on wrong data type should not cause NoMethodError.
2014-08-18 17:32:29 +03:00
Florian Weingarten
c0ec0652ae Merge pull request #421 from djreimer/url-encode-filter
Add url_encode standard filter
2014-08-15 20:05:39 +02:00
Derrick Reimer
f8c3cea09b Add url_encode filter to history 2014-08-15 11:03:06 -07:00
Derrick Reimer
0b847e553c Add url_encode standard filter 2014-08-15 08:45:40 -07:00
Florian Weingarten
c2663258be Merge pull request #364 from collectiveidea/instrument-rendering-with-hooks
Profiling the rendering of a liquid template
2014-08-13 23:04:29 +02:00
Tristan Hume
d4654d0062 Merge pull request #417 from Shopify/simplify-regex
Simplify Variable Parsing Regexes
2014-08-13 12:07:35 -04:00
Tristan Hume
ffd4f9d959 Simplify secondary filter regex 2014-08-13 09:36:02 -04:00
Tristan Hume
292161865d Simplify filter parse regex 2014-08-13 09:28:01 -04:00
Florian Weingarten
35808390ee Merge pull request #414 from Shopify/to_liquid_context
Call to_liquid in Context invoke
2014-08-12 22:05:52 +02:00
Florian Weingarten
1678c07548 Call to_liquid in Context invoke 2014-08-12 19:54:12 +00:00
Jason Roelofs
173a58d36a Profile liquid rendering
Add a simple profiling system to liquid rendering. Each
liquid tag ({{ }} and {% %}) is processed through this profiling,
keeping track of the partial name (in the case of {% include %}), line
number, and the time it took to render the tag. In the case of {%
include %}, the profiler keeps track of the name of the partial and
properly links back tag rendering to the partial and line number for
easy lookup and dive down. With this, it's now possible to track down
exactly how long each tag takes to render.

These hooks get installed and uninstalled on an as-need basis so by
default there is no impact on the overall liquid execution speed.
2014-08-12 15:37:21 -04:00
Tristan Hume
f31e309770 Merge pull request #416 from Shopify/filter-quirks
Make Filter Quirks Tests Actual Integration Tests
2014-08-12 10:08:05 -04:00
Tristan Hume
ffe1036e15 Make tests actual integration tests 2014-08-12 09:27:46 -04:00
Dylan Thacker-Smith
d3b113d2e1 Merge pull request #391 from Shopify/extract-context-parse
Separate expression parsing and rendering from Context#[]
2014-08-11 14:17:54 -07:00
Dylan Thacker-Smith
2aa9bbbac2 Separate expression parsing and rendering from Context#resolve. 2014-08-11 14:15:58 -07:00
Tristan Hume
d5e57a8ea4 Merge pull request #412 from Shopify/assign-strict
Pass through options on assign tag
2014-08-11 15:37:49 -04:00
Florian Weingarten
5c0e0be639 Merge pull request #402 from Shopify/benchmark-ips
benchmark/ips
2014-08-11 21:22:43 +02:00
Florian Weingarten
a74d40f1e5 benchmark/ips 2014-08-11 19:22:06 +00:00
Tristan Hume
79d4ec1a48 Merge pull request #413 from Shopify/filter-quirks
Add quirks test for unanchored filter args
2014-08-11 13:06:51 -04:00
Tristan Hume
4db22be8ba Add tests for assign tag fix 2014-08-11 13:06:01 -04:00
Tristan Hume
dc58a4d648 Add quirks test for unanchored filter args 2014-08-11 11:58:36 -04:00
Tristan Hume
2809ec780a Pass through options on assign tag 2014-08-11 10:38:36 -04:00
Jean Boussier
2d98392bf5 Merge pull request #411 from Shopify/to-s-before-split
Cast input to string before spliting
2014-08-08 00:13:35 -04:00
Jean Boussier
df6b442816 Cast input to string before spliting 2014-08-07 14:01:44 -04:00
Florian Weingarten
4b22fc8d1b Merge pull request #407 from Shopify/slice_arrays
Slice filter for arrays
2014-08-05 20:00:45 +02:00
Florian Weingarten
fb6f9c1c13 Slice filter for arrays. 2014-08-05 17:59:31 +00:00
Florian Weingarten
66ae7f3ec0 Merge pull request #406 from Shopify/slice_filter
slice filter
2014-08-05 17:14:01 +02:00
Florian Weingarten
0bea31d2ef Use Integer() instead of to_i 2014-08-05 15:13:15 +00:00
Florian Weingarten
e5b0487fef Merge pull request #312 from Shopify/uniq_filter
uniq filter
2014-08-05 16:22:48 +02:00
Florian Weingarten
9117722740 Use symbols in respond_to? 2014-08-05 14:22:11 +00:00
Florian Weingarten
baea0a6bf7 slice filter 2014-08-04 16:47:08 +00:00
Tom Burns
17347d43de Merge pull request #400 from Shopify/lazy_stack
lazily create stacks
2014-07-30 11:43:31 -04:00
Tom Burns
794ca9f604 make the conditions around stack creation easier to read 2014-07-30 15:42:24 +00:00
Tom Burns
15f6cabf83 avoid a hash comparison 2014-07-30 15:12:22 +00:00
Tom Burns
e53d102a2c use 'unless' instead of 'if !' for simple conditional 2014-07-30 14:59:56 +00:00
Florian Weingarten
33e7b8e373 uniq filter 2014-07-29 13:09:34 +00:00
Florian Weingarten
9b8e3d437e Merge pull request #401 from Shopify/ktdreyer-minitest
Minitest 5 (continuation of #358)
2014-07-29 15:05:23 +02:00
Florian Weingarten
a2f0f2547d with_global_filter test helper 2014-07-28 19:28:22 +00:00
Ken Dreyer
57d5426eed tests: reset Strainer's filters after modification
Three tests in the test suite use the Liquid::Template.register_filter
function to register custom filters with Liquid::Strainer. The problem
is that these register_filter calls leave the Liquid::Strainer object in
an altered state.

As an example, the FiltersTest's test_local_filter relies on the default
behavior of Liquid::Strainer operator, and the test was failing if
register_function had been called earlier. The same thing was happening
with FiltersInTemplate's test_local_global.

The problem was present when the Filters test classes were loaded inside
a single ruby process that also loaded HashOrderingTest. One example is
"rake test", which runs "require" on every test file. Another basic
example is the following command:

  ruby -Itest -e "require 'integration/hash_ordering_test';
  require 'integration/filter_test'"

Update the tests to always reset Liquid::Strainer's filters back to the
default list of filters.

With this change, FiltersTest and FiltersInTemplate now pass.
2014-07-28 16:36:43 +00:00
Ken Dreyer
3e3a415457 tests: fix whitespace in hash_ordering_test
Indent two spaces, not one.
2014-07-28 16:36:43 +00:00
Ken Dreyer
deba039d6d tests: reset "contains" op during IfElseTagTest
Two tests in IfElseTagTest each set a custom operator function for the
"contains" comparison operator.

The problem is that IfElseTagTest was clobbering the original operator
in Liquid and leaving it in an altered state.

As an example, ConditionUnitTest's test_contains_works_on_arrays relies
on the specific behavior of the "contains" operator, and its
test_contains_works_on_arrays was failing.

The problem was present when both test classes were require'd inside a
single ruby process. One example is "rake test", which runs "require" on
every test file. Another basic example is the following command:

  ruby -Itest -e "require 'integration/tags/if_else_tag_test.rb';
  require 'unit/condition_unit_test.rb'"

This would cause test_contains_works_on_arrays to fail.

Update IfElseTagTest to avoid clobbering the "contains" operator.

With this change, ConditionUnitTest's test_contains_works_on_arrays now
passes.
2014-07-28 16:36:43 +00:00
Ken Dreyer
ee4295c889 tests: switch to minitest
Ruby 1.9+ uses Minitest as the backend for Test::Unit. As of Minitest 5,
the shim has broken some compatibility with Test::Unit::TestCase in some
scenarios.

Adjusts the test suite to support Minitest 5's syntax.

Minitest versions 4 and below do not support the newer Minitest::Test
class that arrived in version 5. For that case, use the
MiniTest::Unit::TestCase class as a fallback

Conflicts:
	test/integration/tags/for_tag_test.rb
	test/test_helper.rb
2014-07-28 16:36:38 +00:00
Tom Burns
f5e67a12f9 remove added newline in liquid.rb 2014-07-28 14:24:29 +00:00
Tom Burns
6b56bdd74f remove variables used for counting empty stacks 2014-07-28 14:23:16 +00:00
Tom Burns
ba6e3e3da6 lazily create stacks 2014-07-28 14:12:11 +00:00
Jason Hiltz-Laforge
a8e63ff03d Merge pull request #398 from Shopify/fix_order_of_constructor_initialize
Reorder constructor to avoid referencing uninitialized variable when environment contains a self-referencing proc
2014-07-24 15:04:36 -04:00
Jason Hiltz-Laforge
052ef9fcb8 Reorder constructor to avoid referencing uninitialized variable when environment contains a self-referencing proc 2014-07-24 18:58:23 +00:00
Arthur Neves
d07b12dc7d Update History log
Bring latest History from 2-6-stable and 2-5-stable
2014-07-24 11:01:19 -04:00
Arthur Nogueira Neves
32e4f2d3b1 Merge pull request #240 from Shopify/remove_flatten
remove .flatten on standard filters
2014-07-24 10:54:28 -04:00
Arthur Nogueira Neves
2cb1483d54 Merge pull request #397 from Shopify/bogdan-excetion-handling-for-humans
Excetion handling for humans (2)
2014-07-24 10:51:02 -04:00
Florian Weingarten
6c6350f18b Exception handling for humans
Ability to pass exception_handler as a block to #render
and provide whatever behavior you want on handling exceptions

https://github.com/Shopify/liquid/pull/254
2014-07-24 14:44:02 +00:00
Florian Weingarten
eae24373e6 remove unnecessary flatten filter 2014-07-24 02:56:57 +00:00
Jason Hiltz-Laforge
034a47a6cf Merge pull request #395 from Shopify/fix_block_delimiter
Forgot an error message case
2014-07-23 22:35:13 -04:00
Jason Hiltz-Laforge
51c1165f26 Forgot an error message case 2014-07-24 02:27:26 +00:00
Florian Weingarten
0b45ffeada add more legacy tests 2014-07-24 00:33:39 +00:00
Arthur Neves
b7b243a13d Fix regression on map 2014-07-23 17:16:21 -04:00
Arthur Neves
18e8ce1eb0 add flatten filter 2014-07-23 17:16:20 -04:00
Florian Weingarten
994f309465 Fix broken standardfilter test 2014-07-23 17:15:39 -04:00
Arthur Neves
02d42a1475 Array is a Enumerable 2014-07-23 17:14:27 -04:00
Arthur Neves
d099878385 add a input iterator to standard filter 2014-07-23 17:14:27 -04:00
Arthur Neves
6a061cbe81 remove .flatten on standard filters 2014-07-23 17:14:26 -04:00
Arthur Nogueira Neves
c864a75903 Merge pull request #341 from curebit/comparation_argument_error
Raise Liquid::ArugmentError when condition has wrong usage
2014-07-23 17:03:31 -04:00
Jason Hiltz-Laforge
d6fdf86acd Merge pull request #393 from Shopify/fix_block_delimiter
Fixing regression from block delimiter enhancement
2014-07-23 16:24:24 -04:00
Jason Hiltz-Laforge
55597b8398 Fixing regression from block delimiter enhancement 2014-07-23 19:18:02 +00:00
Bogdan Gusiev
fa14fd02e7 Raise Liquid::ArugmentError when condition has wrong usage
Condition now raises ::ArgumentError when built wrongly.
This patch make it raise Liquid::ArgumentError instead
to indicate a liquid markup error instead of ruby error.
2014-04-21 16:42:37 +03:00
284 changed files with 17119 additions and 14173 deletions

2
.github/probots.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
enabled:
- cla

39
.github/workflows/liquid.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
name: Liquid
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
entry:
- { ruby: 2.5, allowed-failure: false } # minimum supported
- { ruby: 3.0, allowed-failure: false } # latest
- { ruby: ruby-head, allowed-failure: true }
name: test (${{ matrix.entry.ruby }})
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.entry.ruby }}
- uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('Gemfile') }}
restore-keys: ${{ runner.os }}-gems-
- run: bundle install --jobs=3 --retry=3 --path=vendor/bundle
- run: bundle exec rake
continue-on-error: ${{ matrix.entry.allowed-failure }}
memory_profile:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
- uses: actions/cache@v1
with:
path: vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('Gemfile') }}
restore-keys: ${{ runner.os }}-gems-
- run: bundle install --jobs=3 --retry=3 --path=vendor/bundle
- run: bundle exec rake memory_profile:run

2
.gitignore vendored
View File

@@ -6,3 +6,5 @@ pkg
.rvmrc
.ruby-version
Gemfile.lock
.bundle
.byebug_history

20
.rubocop.yml Normal file
View File

@@ -0,0 +1,20 @@
inherit_gem:
rubocop-shopify: rubocop.yml
inherit_from:
- .rubocop_todo.yml
require: rubocop-performance
Performance:
Enabled: true
AllCops:
TargetRubyVersion: 2.4
NewCops: disable
Exclude:
- 'vendor/bundle/**/*'
Naming/MethodName:
Exclude:
- 'example/server/liquid_servlet.rb'

57
.rubocop_todo.yml Normal file
View File

@@ -0,0 +1,57 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2020-12-11 18:53:41 UTC using RuboCop version 1.6.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: runtime_error, standard_error
Lint/InheritException:
Exclude:
- 'lib/liquid/interrupts.rb'
# Offense count: 113
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 260
# Offense count: 8
Lint/MissingSuper:
Exclude:
- 'lib/liquid/forloop_drop.rb'
- 'lib/liquid/tablerowloop_drop.rb'
- 'test/integration/assign_test.rb'
- 'test/integration/context_test.rb'
- 'test/integration/filter_test.rb'
- 'test/integration/standard_filter_test.rb'
- 'test/integration/tags/for_tag_test.rb'
- 'test/integration/tags/table_row_test.rb'
# Offense count: 43
Naming/ConstantName:
Exclude:
- 'lib/liquid.rb'
- 'lib/liquid/block_body.rb'
- 'lib/liquid/tags/assign.rb'
- 'lib/liquid/tags/capture.rb'
- 'lib/liquid/tags/case.rb'
- 'lib/liquid/tags/cycle.rb'
- 'lib/liquid/tags/for.rb'
- 'lib/liquid/tags/if.rb'
- 'lib/liquid/tags/raw.rb'
- 'lib/liquid/tags/table_row.rb'
- 'lib/liquid/variable.rb'
- 'performance/shopify/comment_form.rb'
- 'performance/shopify/paginate.rb'
- 'test/integration/tags/include_tag_test.rb'
# Offense count: 2
Style/ClassVars:
Exclude:
- 'lib/liquid/condition.rb'

View File

@@ -1,16 +0,0 @@
rvm:
- 1.9
- 2.0
- 2.1
- jruby-19mode
- jruby-head
- rbx-2
matrix:
allow_failures:
- rvm: rbx-2
- rvm: jruby-head
script: "rake test"
notifications:
disable: true

28
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,28 @@
# How to contribute
## Things we will merge
* Bugfixes
* Performance improvements
* Features that are likely to be useful to the majority of Liquid users
* Documentation updates that are concise and likely to be useful to the majority of Liquid users
## Things we won't merge
* Code that introduces considerable performance degrations
* Code that touches performance-critical parts of Liquid and comes without benchmarks
* Features that are not important for most people (we want to keep the core Liquid code small and tidy)
* Features that can easily be implemented on top of Liquid (for example as a custom filter or custom filesystem)
* Code that does not include tests
* Code that breaks existing tests
* Documentation changes that are verbose, incorrect or not important to most people (we want to keep it simple and easy to understand)
## Workflow
* [Sign the CLA](https://cla.shopify.com/) if you haven't already
* Fork the Liquid repository
* Create a new branch in your fork
* For updating [Liquid documentation](https://shopify.github.io/liquid/), create it from `gh-pages` branch. (You can skip tests.)
* If it makes sense, add tests for your code and/or run a performance benchmark
* Make sure all tests pass (`bundle exec rake`)
* Create a pull request

28
Gemfile Normal file
View File

@@ -0,0 +1,28 @@
# frozen_string_literal: true
source 'https://rubygems.org'
git_source(:github) do |repo_name|
"https://github.com/#{repo_name}.git"
end
gemspec
group :benchmark, :test do
gem 'benchmark-ips'
gem 'memory_profiler'
gem 'terminal-table'
install_if -> { RUBY_PLATFORM !~ /mingw|mswin|java/ && RUBY_ENGINE != 'truffleruby' } do
gem 'stackprof'
end
end
group :test do
gem 'rubocop', '~> 1.4', require: false
gem 'rubocop-shopify', '~> 1.0.7', require: false
gem 'rubocop-performance', require: false
platform :mri, :truffleruby do
gem 'liquid-c', github: 'Shopify/liquid-c', ref: 'master'
end
end

336
History.md Normal file
View File

@@ -0,0 +1,336 @@
# Liquid Change Log
## 5.0.2 (unreleased)
### Fixes
* Fix support for using a String subclass for the liquid source (#1421) [Dylan Thacker-Smith]
## 5.0.1 / 2021-03-24
### Fixes
* Add ParseTreeVisitor to Echo tag (#1414) [CP Clermont]
* Test with ruby 3.0 as the latest ruby version (#1398) [Dylan Thacker-Smith]
* Handle carriage return in newlines_to_br (#1391) [Unending]
### Performance Improvements
* Use split limit in truncatewords (#1361) [Dylan Thacker-Smith]
## 5.0.0 / 2021-01-06
### Features
* Add new `{% render %}` tag (#1122) [Samuel Doiron]
* Add support for `as` in `{% render %}` and `{% include %}` (#1181) [Mike Angell]
* Add `{% liquid %}` and `{% echo %}` tags (#1086) [Justin Li]
* Add [usage tracking](README.md#usage-tracking) [Mike Angell]
* Add `Tag.disable_tags` for disabling tags that prepend `Tag::Disableable` at render time (#1162, #1274, #1275) [Mike Angell]
* Support using a profiler for multiple renders (#1365, #1366) [Dylan Thacker-Smith]
### Fixes
* Fix catastrophic backtracking in `RANGES_REGEX` regular expression (#1357) [Dylan Thacker-Smith]
* Make sure the for tag's limit and offset are integers (#1094) [David Cornu]
* Invokable methods for enumerable reject include (#1151) [Thierry Joyal]
* Allow `default` filter to handle `false` as value (#1144) [Mike Angell]
* Fix render length resource limit so it doesn't multiply nested output (#1285) [Dylan Thacker-Smith]
* Fix duplication of text in raw tags (#1304) [Peter Zhu]
* Fix strict parsing of find variable with a name expression (#1317) [Dylan Thacker-Smith]
* Use monotonic time to measure durations in Liquid::Profiler (#1362) [Dylan Thacker-Smith]
### Breaking Changes
* Require Ruby >= 2.5 (#1131, #1310) [Mike Angell, Dylan Thacker-Smith]
* Remove support for taint checking (#1268) [Dylan Thacker-Smith]
* Split Strainer class into StrainerFactory and StrainerTemplate (#1208) [Thierry Joyal]
* Remove handling of a nil context in the Strainer class (#1218) [Thierry Joyal]
* Handle `BlockBody#blank?` at parse time (#1287) [Dylan Thacker-Smith]
* Pass the tag markup and tokenizer to `Document#unknown_tag` (#1290) [Dylan Thacker-Smith]
* And several internal changes
### Performance Improvements
* Reduce allocations (#1073, #1091, #1115, #1099, #1117, #1141, #1322, #1341) [Richard Monette, Florian Weingarten, Ashwin Maroli]
* Improve resources limits performance (#1093, #1323) [Florian Weingarten, Dylan Thacker-Smith]
## 4.0.3 / 2019-03-12
### Fixed
* Fix break and continue tags inside included templates in loops (#1072) [Justin Li]
## 4.0.2 / 2019-03-08
### Changed
* Add `where` filter (#1026) [Samuel Doiron]
* Add `ParseTreeVisitor` to iterate the Liquid AST (#1025) [Stephen Paul Weber]
* Improve `strip_html` performance (#1032) [printercu]
### Fixed
* Add error checking for invalid combinations of inputs to sort, sort_natural, where, uniq, map, compact filters (#1059) [Garland Zhang]
* Validate the character encoding in url_decode (#1070) [Clayton Smith]
## 4.0.1 / 2018-10-09
### Changed
* Add benchmark group in Gemfile (#855) [Jerry Liu]
* Allow benchmarks to benchmark render by itself (#851) [Jerry Liu]
* Avoid calling `line_number` on String node when rescuing a render error. (#860) [Dylan Thacker-Smith]
* Avoid duck typing to detect whether to call render on a node. [Dylan Thacker-Smith]
* Clarify spelling of `reversed` on `for` block tag (#843) [Mark Crossfield]
* Replace recursion with loop to avoid potential stack overflow from malicious input (#891, #892) [Dylan Thacker-Smith]
* Limit block tag nesting to 100 (#894) [Dylan Thacker-Smith]
* Replace `assert_equal nil` with `assert_nil` (#895) [Dylan Thacker-Smith]
* Remove Spy Gem (#896) [Dylan Thacker-Smith]
* Add `collection_name` and `variable_name` reader to `For` block (#909)
* Symbols render as strings (#920) [Justin Li]
* Remove default value from Hash objects (#932) [Maxime Bedard]
* Remove one level of nesting (#944) [Dylan Thacker-Smith]
* Update Rubocop version (#952) [Justin Li]
* Add `at_least` and `at_most` filters (#954, #958) [Nithin Bekal]
* Add a regression test for a liquid-c trim mode bug (#972) [Dylan Thacker-Smith]
* Use https rather than git protocol to fetch liquid-c [Dylan Thacker-Smith]
* Add tests against Ruby 2.4 (#963) and 2.5 (#981)
* Replace RegExp literals with constants (#988) [Ashwin Maroli]
* Replace unnecessary `#each_with_index` with `#each` (#992) [Ashwin Maroli]
* Improve the unexpected end delimiter message for block tags. (#1003) [Dylan Thacker-Smith]
* Refactor and optimize rendering (#1005) [Christopher Aue]
* Add installation instruction (#1006) [Ben Gift]
* Remove Circle CI (#1010)
* Rename deprecated `BigDecimal.new` to `BigDecimal` (#1024) [Koichi ITO]
* Rename deprecated Rubocop name (#1027) [Justin Li]
### Fixed
* Handle `join` filter on non String joiners (#857) [Richard Monette]
* Fix duplicate inclusion condition logic error of `Liquid::Strainer.add_filter` method (#861)
* Fix `escape`, `url_encode`, `url_decode` not handling non-string values (#898) [Thierry Joyal]
* Fix raise when variable is defined but nil when using `strict_variables` [Pascal Betz]
* Fix `sort` and `sort_natural` to handle arrays with nils (#930) [Eric Chan]
## 4.0.0 / 2016-12-14 / branch "4-0-stable"
### Changed
* Render an opaque internal error by default for non-Liquid::Error (#835) [Dylan Thacker-Smith]
* Ruby 2.0 support dropped (#832) [Dylan Thacker-Smith]
* Add to_number Drop method to allow custom drops to work with number filters (#731)
* Add strict_variables and strict_filters options to detect undefined references (#691)
* Improve loop performance (#681) [Florian Weingarten]
* Rename Drop method `before_method` to `liquid_method_missing` (#661) [Thierry Joyal]
* Add url_decode filter to invert url_encode (#645) [Larry Archer]
* Add global_filter to apply a filter to all output (#610) [Loren Hale]
* Add compact filter (#600) [Carson Reinke]
* Rename deprecated "has_key?" and "has_interrupt?" methods (#593) [Florian Weingarten]
* Include template name with line numbers in render errors (574) [Dylan Thacker-Smith]
* Add sort_natural filter (#554) [Martin Hanzel]
* Add forloop.parentloop as a reference to the parent loop (#520) [Justin Li]
* Block parsing moved to BlockBody class (#458) [Dylan Thacker-Smith]
* Add concat filter to concatenate arrays (#429) [Diogo Beato]
* Ruby 1.9 support dropped (#491) [Justin Li]
* Liquid::Template.file_system's read_template_file method is no longer passed the context. (#441) [James Reid-Smith]
* Remove `liquid_methods` (See https://github.com/Shopify/liquid/pull/568 for replacement)
* Liquid::Template.register_filter raises when the module overrides registered public methods as private or protected (#705) [Gaurav Chande]
### Fixed
* Fix variable names being detected as an operator when starting with contains (#788) [Michael Angell]
* Fix include tag used with strict_variables (#828) [QuickPay]
* Fix map filter when value is a Proc (#672) [Guillaume Malette]
* Fix truncate filter when value is not a string (#672) [Guillaume Malette]
* Fix behaviour of escape filter when input is nil (#665) [Tanel Jakobsoo]
* Fix sort filter behaviour with empty array input (#652) [Marcel Cary]
* Fix test failure under certain timezones (#631) [Dylan Thacker-Smith]
* Fix bug in uniq filter (#595) [Florian Weingarten]
* Fix bug when "blank" and "empty" are used as variable names (#592) [Florian Weingarten]
* Fix condition parse order in strict mode (#569) [Justin Li]
* Fix naming of the "context variable" when dynamically including a template (#559) [Justin Li]
* Gracefully accept empty strings in the date filter (#555) [Loren Hale]
* Fix capturing into variables with a hyphen in the name (#505) [Florian Weingarten]
* Fix case sensitivity regression in date standard filter (#499) [Kelley Reynolds]
* Disallow filters with no variable in strict mode (#475) [Justin Li]
* Disallow variable names in the strict parser that are not valid in the lax parser (#463) [Justin Li]
* Fix BlockBody#warnings taking exponential time to compute (#486) [Justin Li]
## 3.0.5 / 2015-07-23 / branch "3-0-stable"
* Fix test failure under certain timezones [Dylan Thacker-Smith]
## 3.0.4 / 2015-07-17
* Fix chained access to multi-dimensional hashes [Florian Weingarten]
## 3.0.3 / 2015-05-28
* Fix condition parse order in strict mode (#569) [Justin Li]
## 3.0.2 / 2015-04-24
* Expose VariableLookup private members (#551) [Justin Li]
* Documentation fixes
## 3.0.1 / 2015-01-23
* Remove duplicate `index0` key in TableRow tag (#502) [Alfred Xing]
## 3.0.0 / 2014-11-12
* Removed Block#end_tag. Instead, override parse with `super` followed by your code. See #446 [Dylan Thacker-Smith]
* Fixed condition with wrong data types (#423) [Bogdan Gusiev]
* Add url_encode to standard filters (#421) [Derrick Reimer]
* Add uniq to standard filters [Florian Weingarten]
* Add exception_handler feature (#397) and #254 [Bogdan Gusiev, Florian Weingarten]
* Optimize variable parsing to avoid repeated regex evaluation during template rendering #383 [Jason Hiltz-Laforge]
* Optimize checking for block interrupts to reduce object allocation #380 [Jason Hiltz-Laforge]
* Properly set context rethrow_errors on render! #349 [Thierry Joyal]
* Fix broken rendering of variables which are equal to false (#345) [Florian Weingarten]
* Remove ActionView template handler [Dylan Thacker-Smith]
* Freeze lots of string literals for new Ruby 2.1 optimization (#297) [Florian Weingarten]
* Allow newlines in tags and variables (#324) [Dylan Thacker-Smith]
* Tag#parse is called after initialize, which now takes options instead of tokens as the 3rd argument. See #321 [Dylan Thacker-Smith]
* Raise `Liquid::ArgumentError` instead of `::ArgumentError` when filter has wrong number of arguments #309 [Bogdan Gusiev]
* Add a to_s default for liquid drops (#306) [Adam Doeler]
* Add strip, lstrip, and rstrip to standard filters [Florian Weingarten]
* Make if, for & case tags return complete and consistent nodelists (#250) [Nick Jones]
* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
* Fix resource counting bug with respond_to?(:length) (#263) [Florian Weingarten]
* Allow specifying custom patterns for template filenames (#284) [Andrei Gladkyi]
* Allow drops to optimize loading a slice of elements (#282) [Tom Burns]
* Support for passing variables to snippets in subdirs (#271) [Joost Hietbrink]
* Add a class cache to avoid runtime extend calls (#249) [James Tucker]
* Remove some legacy Ruby 1.8 compatibility code (#276) [Florian Weingarten]
* Add default filter to standard filters (#267) [Derrick Reimer]
* Add optional strict parsing and warn parsing (#235) [Tristan Hume]
* Add I18n syntax error translation (#241) [Simon Hørup Eskildsen, Sirupsen]
* Make sort filter work on enumerable drops (#239) [Florian Weingarten]
* Fix clashing method names in enumerable drops (#238) [Florian Weingarten]
* Make map filter work on enumerable drops (#233) [Florian Weingarten]
* Improved whitespace stripping for blank blocks, related to #216 [Florian Weingarten]
## 2.6.3 / 2015-07-23 / branch "2-6-stable"
* Fix test failure under certain timezones [Dylan Thacker-Smith]
## 2.6.2 / 2015-01-23
* Remove duplicate hash key [Parker Moore]
## 2.6.1 / 2014-01-10
Security fix, cherry-picked from master (4e14a65):
* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
## 2.6.0 / 2013-11-25
IMPORTANT: Liquid 2.6 is going to be the last version of Liquid which maintains explicit Ruby 1.8 compatability.
The following releases will only be tested against Ruby 1.9 and Ruby 2.0 and are likely to break on Ruby 1.8.
* Bugfix for #106: fix example servlet [gnowoel]
* Bugfix for #97: strip_html filter supports multi-line tags [Jo Liss]
* Bugfix for #114: strip_html filter supports style tags [James Allardice]
* Bugfix for #117: 'now' support for date filter in Ruby 1.9 [Notre Dame Webgroup]
* Bugfix for #166: truncate filter on UTF-8 strings with Ruby 1.8 [Florian Weingarten]
* Bugfix for #204: 'raw' parsing bug [Florian Weingarten]
* Bugfix for #150: 'for' parsing bug [Peter Schröder]
* Bugfix for #126: Strip CRLF in strip_newline [Peter Schröder]
* Bugfix for #174, "can't convert Fixnum into String" for "replace" [jsw0528]
* Allow a Liquid::Drop to be passed into Template#render [Daniel Huckstep]
* Resource limits [Florian Weingarten]
* Add reverse filter [Jay Strybis]
* Add utf-8 support
* Use array instead of Hash to keep the registered filters [Tasos Stathopoulos]
* Cache tokenized partial templates [Tom Burns]
* Avoid warnings in Ruby 1.9.3 [Marcus Stollsteimer]
* Better documentation for 'include' tag (closes #163) [Peter Schröder]
* Use of BigDecimal on filters to have better precision (closes #155) [Arthur Nogueira Neves]
## 2.5.5 / 2014-01-10 / branch "2-5-stable"
Security fix, cherry-picked from master (4e14a65):
* Don't call to_sym when creating conditions for security reasons (#273) [Bouke van der Bijl]
* Prevent arbitrary method invocation on condition objects (#274) [Dylan Thacker-Smith]
## 2.5.4 / 2013-11-11
* Fix "can't convert Fixnum into String" for "replace" (#173), [jsw0528]
## 2.5.3 / 2013-10-09
* #232, #234, #237: Fix map filter bugs [Florian Weingarten]
## 2.5.2 / 2013-09-03 / deleted
Yanked from rubygems, as it contained too many changes that broke compatibility. Those changes will be on following major releases.
## 2.5.1 / 2013-07-24
* #230: Fix security issue with map filter, Use invoke_drop in map filter [Florian Weingarten]
## 2.5.0 / 2013-03-06
* Prevent Object methods from being called on drops
* Avoid symbol injection from liquid
* Added break and continue statements
* Fix filter parser for args without space separators
* Add support for filter keyword arguments
## 2.4.0 / 2012-08-03
* Performance improvements
* Allow filters in `assign`
* Add `modulo` filter
* Ruby 1.8, 1.9, and Rubinius compatibility fixes
* Add support for `quoted['references']` in `tablerow`
* Add support for Enumerable to `tablerow`
* `strip_html` filter removes html comments
## 2.3.0 / 2011-10-16
* Several speed/memory improvements
* Numerous bug fixes
* Added support for MRI 1.9, Rubinius, and JRuby
* Added support for integer drop parameters
* Added epoch support to `date` filter
* New `raw` tag that suppresses parsing
* Added `else` option to `for` tag
* New `increment` tag
* New `split` filter
## 2.2.1 / 2010-08-23
* Added support for literal tags
## 2.2.0 / 2010-08-22
* Compatible with Ruby 1.8.7, 1.9.1 and 1.9.2-p0
* Merged some changed made by the community
## 1.9.0 / 2008-03-04
* Fixed gem install rake task
* Improve Error encapsulation in liquid by maintaining a own set of exceptions instead of relying on ruby build ins
## Before 1.9.0
* Added If with or / and expressions
* Implemented .to_liquid for all objects which can be passed to liquid like Strings Arrays Hashes Numerics and Booleans. To export new objects to liquid just implement .to_liquid on them and return objects which themselves have .to_liquid methods.
* Added more tags to standard library
* Added include tag ( like partials in rails )
* [...] Gazillion of detail improvements
* Added strainers as filter hosts for better security [Tobias Luetke]
* Fixed that rails integration would call filter with the wrong "self" [Michael Geary]
* Fixed bad error reporting when a filter called a method which doesn't exist. Liquid told you that it couldn't find the filter which was obviously misleading [Tobias Luetke]
* Removed count helper from standard lib. use size [Tobias Luetke]
* Fixed bug with string filter parameters failing to tolerate commas in strings. [Paul Hammond]
* Improved filter parameters. Filter parameters are now context sensitive; Types are resolved according to the rules of the context. Multiple parameters are now separated by the Liquid::ArgumentSeparator: , by default [Paul Hammond]
{{ 'Typo' | link_to: 'http://typo.leetsoft.com', 'Typo - a modern weblog engine' }}
* Added Liquid::Drop. A base class which you can use for exporting proxy objects to liquid which can acquire more data when used in liquid. [Tobias Luetke]
class ProductDrop < Liquid::Drop
def top_sales
Shop.current.products.find(:all, :order => 'sales', :limit => 10 )
end
end
t = Liquid::Template.parse( ' {% for product in product.top_sales %} {{ product.name }} {% endfor %} ' )
t.render('product' => ProductDrop.new )
* Added filter parameters support. Example: {{ date | format_date: "%Y" }} [Paul Hammond]

20
LICENSE Normal file
View File

@@ -0,0 +1,20 @@
Copyright (c) 2005, 2006 Tobias Luetke
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.

115
README.md
View File

@@ -1,3 +1,114 @@
#### Liquid Docs
[![Build Status](https://api.travis-ci.org/Shopify/liquid.svg?branch=master)](http://travis-ci.org/Shopify/liquid)
[![Inline docs](http://inch-ci.org/github/Shopify/liquid.svg?branch=master)](http://inch-ci.org/github/Shopify/liquid)
Home of the Liquid Docs
# Liquid template engine
* [Contributing guidelines](CONTRIBUTING.md)
* [Version history](History.md)
* [Liquid documentation from Shopify](http://docs.shopify.com/themes/liquid-basics)
* [Liquid Wiki at GitHub](https://github.com/Shopify/liquid/wiki)
* [Website](http://liquidmarkup.org/)
## Introduction
Liquid is a template engine which was written with very specific requirements:
* It has to have beautiful and simple markup. Template engines which don't produce good looking markup are no fun to use.
* It needs to be non evaling and secure. Liquid templates are made so that users can edit them. You don't want to run code on your server which your users wrote.
* It has to be stateless. Compile and render steps have to be separate so that the expensive parsing and compiling can be done once and later on you can just render it passing in a hash with local variables and objects.
## Why you should use Liquid
* You want to allow your users to edit the appearance of your application but don't want them to run **insecure code on your server**.
* You want to render templates directly from the database.
* You like smarty (PHP) style template engines.
* You need a template engine which does HTML just as well as emails.
* You don't like the markup of your current templating engine.
## What does it look like?
```html
<ul id="products">
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
Only {{ product.price | price }}
{{ product.description | prettyprint | paragraph }}
</li>
{% endfor %}
</ul>
```
## How to use Liquid
Install Liquid by adding `gem 'liquid'` to your gemfile.
Liquid supports a very simple API based around the Liquid::Template class.
For standard use you can just pass it the content of a file and call render with a parameters hash.
```ruby
@template = Liquid::Template.parse("hi {{name}}") # Parses and compiles the template
@template.render('name' => 'tobi') # => "hi tobi"
```
### Error Modes
Setting the error mode of Liquid lets you specify how strictly you want your templates to be interpreted.
Normally the parser is very lax and will accept almost anything without error. Unfortunately this can make
it very hard to debug and can lead to unexpected behaviour.
Liquid also comes with a stricter parser that can be used when editing templates to give better error messages
when templates are invalid. You can enable this new parser like this:
```ruby
Liquid::Template.error_mode = :strict # Raises a SyntaxError when invalid syntax is used
Liquid::Template.error_mode = :warn # Adds errors to template.errors but continues as normal
Liquid::Template.error_mode = :lax # The default mode, accepts almost anything.
```
If you want to set the error mode only on specific templates you can pass `:error_mode` as an option to `parse`:
```ruby
Liquid::Template.parse(source, :error_mode => :strict)
```
This is useful for doing things like enabling strict mode only in the theme editor.
It is recommended that you enable `:strict` or `:warn` mode on new apps to stop invalid templates from being created.
It is also recommended that you use it in the template editors of existing apps to give editors better error messages.
### Undefined variables and filters
By default, the renderer doesn't raise or in any other way notify you if some variables or filters are missing, i.e. not passed to the `render` method.
You can improve this situation by passing `strict_variables: true` and/or `strict_filters: true` options to the `render` method.
When one of these options is set to true, all errors about undefined variables and undefined filters will be stored in `errors` array of a `Liquid::Template` instance.
Here are some examples:
```ruby
template = Liquid::Template.parse("{{x}} {{y}} {{z.a}} {{z.b}}")
template.render({ 'x' => 1, 'z' => { 'a' => 2 } }, { strict_variables: true })
#=> '1 2 ' # when a variable is undefined, it's rendered as nil
template.errors
#=> [#<Liquid::UndefinedVariable: Liquid error: undefined variable y>, #<Liquid::UndefinedVariable: Liquid error: undefined variable b>]
```
```ruby
template = Liquid::Template.parse("{{x | filter1 | upcase}}")
template.render({ 'x' => 'foo' }, { strict_filters: true })
#=> '' # when at least one filter in the filter chain is undefined, a whole expression is rendered as nil
template.errors
#=> [#<Liquid::UndefinedFilter: Liquid error: undefined filter filter1>]
```
If you want to raise on a first exception instead of pushing all of them in `errors`, you can use `render!` method:
```ruby
template = Liquid::Template.parse("{{x}} {{y}}")
template.render!({ 'x' => 1}, { strict_variables: true })
#=> Liquid::UndefinedVariable: Liquid error: undefined variable y
```
### Usage tracking
To help track usages of a feature or code path in production, we have released opt-in usage tracking. To enable this, we provide an empty `Liquid:: Usage.increment` method which you can customize to your needs. The feature is well suited to https://github.com/Shopify/statsd-instrument. However, the choice of implementation is up to you.
Once you have enabled usage tracking, we recommend reporting any events through Github Issues that your system may be logging. It is highly likely this event has been added to consider deprecating or improving code specific to this event, so please raise any concerns.

112
Rakefile Executable file
View File

@@ -0,0 +1,112 @@
# frozen_string_literal: true
require 'rake'
require 'rake/testtask'
$LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
require "liquid/version"
task(default: [:test, :rubocop])
desc('run test suite with default parser')
Rake::TestTask.new(:base_test) do |t|
t.libs << 'lib' << 'test'
t.test_files = FileList['test/{integration,unit}/**/*_test.rb']
t.verbose = false
end
Rake::TestTask.new(:integration_test) do |t|
t.libs << 'lib' << 'test'
t.test_files = FileList['test/integration/**/*_test.rb']
t.verbose = false
end
desc('run test suite with warn error mode')
task :warn_test do
ENV['LIQUID_PARSER_MODE'] = 'warn'
Rake::Task['base_test'].invoke
end
task :rubocop do
if RUBY_ENGINE == 'ruby'
require 'rubocop/rake_task'
RuboCop::RakeTask.new
end
end
desc('runs test suite with both strict and lax parsers')
task :test do
ENV['LIQUID_PARSER_MODE'] = 'lax'
Rake::Task['base_test'].invoke
ENV['LIQUID_PARSER_MODE'] = 'strict'
Rake::Task['base_test'].reenable
Rake::Task['base_test'].invoke
if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'truffleruby'
ENV['LIQUID_C'] = '1'
ENV['LIQUID_PARSER_MODE'] = 'lax'
Rake::Task['integration_test'].reenable
Rake::Task['integration_test'].invoke
ENV['LIQUID_PARSER_MODE'] = 'strict'
Rake::Task['integration_test'].reenable
Rake::Task['integration_test'].invoke
end
end
task(gem: :build)
task :build do
system "gem build liquid.gemspec"
end
task install: :build do
system "gem install liquid-#{Liquid::VERSION}.gem"
end
task release: :build do
system "git tag -a v#{Liquid::VERSION} -m 'Tagging #{Liquid::VERSION}'"
system "git push --tags"
system "gem push liquid-#{Liquid::VERSION}.gem"
system "rm liquid-#{Liquid::VERSION}.gem"
end
namespace :benchmark do
desc "Run the liquid benchmark with lax parsing"
task :run do
ruby "./performance/benchmark.rb lax"
end
desc "Run the liquid benchmark with strict parsing"
task :strict do
ruby "./performance/benchmark.rb strict"
end
end
namespace :profile do
desc "Run the liquid profile/performance coverage"
task :run do
ruby "./performance/profile.rb"
end
desc "Run the liquid profile/performance coverage with strict parsing"
task :strict do
ruby "./performance/profile.rb strict"
end
end
namespace :memory_profile do
desc "Run memory profiler"
task :run do
ruby "./performance/memory_profile.rb"
end
end
desc("Run example")
task :example do
ruby "-w -d -Ilib example/server/server.rb"
end
task :console do
exec 'irb -I lib -r liquid'
end

View File

@@ -1,12 +0,0 @@
# Site settings
title: Your awesome title
email: your-email@domain.com
description: "Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description."
baseurl: ""
url: "http://yourdomain.com"
twitter_username: jekyllrb
github_username: jekyll
# Build settings
markdown: kramdown
permalink: pretty

View File

@@ -1,61 +0,0 @@
<footer class="site-footer">
<div class="wrap">
<h2 class="footer-heading">{{ site.title }}</h2>
<div class="footer-col-1 column">
<ul>
<li>{{ site.title }}</li>
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
</ul>
</div>
<div class="footer-col-2 column">
<ul>
{% if site.github_username %}<li>
<a href="https://github.com/{{ site.github_username }}">
<span class="icon github">
<svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
<span class="username">{{ site.github_username }}</span>
</a>
</li>{% endif %}
{% if site.twitter_username %}<li>
<a href="https://twitter.com/{{ site.twitter_username }}">
<span class="icon twitter">
<svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
</svg>
</span>
<span class="username">{{ site.twitter_username }}</span>
</a>
</li>{% endif %}
</ul>
</div>
<div class="footer-col-3 column">
<p class="text">{{ site.description }}</p>
</div>
</div>
</footer>

View File

@@ -1,12 +0,0 @@
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
<meta name="viewport" content="width=device-width">
<meta name="description" content="{{ site.description }}">
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
<!-- Custom CSS -->
<link rel="stylesheet" href="{{ "/css/stylesheets/main.css" | prepend: site.baseurl }}">
</head>

View File

@@ -1,28 +0,0 @@
<header class="site-header">
<div class="wrap">
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
<path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
{% for page in site.pages %}
{% if page.title %}<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>{% endif %}
{% endfor %}
</div>
</nav>
</div>
</header>

View File

@@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
{% include head.html %}
<body>
{% include header.html %}
<div class="page-content">
<div class="wrap">
{{ content }}
</div>
</div>
{% include footer.html %}
</body>
</html>

View File

@@ -1,14 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1>{{ page.title }}</h1>
</header>
<article class="post-content">
{{ content }}
</article>
</div>

View File

@@ -1,15 +0,0 @@
---
layout: default
---
<div class="post">
<header class="post-header">
<h1>{{ page.title }}</h1>
<p class="meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
</header>
<article class="post-content">
{{ content }}
</article>
</div>

View File

@@ -1,24 +0,0 @@
---
layout: post
title: "Welcome to Jekyll!"
date: 2014-07-23 10:55:39
categories: jekyll update
---
You'll find this post in your `_posts` directory - edit this post and re-build (or run with the `-w` switch) to see your changes!
To add new posts, simply add a file in the `_posts` directory that follows the convention: YYYY-MM-DD-name-of-post.ext.
Jekyll also offers powerful support for code snippets:
{% highlight ruby %}
def print_hi(name)
puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.
{% endhighlight %}
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh].
[jekyll-gh]: https://github.com/jekyll/jekyll
[jekyll]: http://jekyllrb.com

View File

@@ -1,101 +0,0 @@
---
layout: default
title: Handles
nav:
group: Liquid Variables
weight: 2
---
# Handles
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "What is a handle?", "what-is-a-handle" %}
The handle is used to access the attributes of a Liquid object. By default, it is the object's title in lowercase with any spaces and special characters replaced by hyphens (-). Every object in Liquid (product, collection, blog, link list) has a handle.
For example, a page with the title "About Us" can be accessed in Liquid via its handle <tt>about-us</tt> as shown below:
{% highlight html %}{% raw %}
<!-- the content of the About Us page -->
{{ pages.about-us.content }}
{% endraw %}{% endhighlight %}
{% anchor_link "How are my handles created?", "handles-created" %}
A product with the title "Shirt" will automatically be given the handle **shirt**. If there is already a product with the handle "Shirt", the handle will auto-increment. In other words, all "Shirt" products created after the first one will receive the handle **shirt-1**, **shirt-2**, and so on.
{{ '/themes/handle-2.jpg' | image }}
Whitespaces in a title are replaced by hyphens in the handle. For example, the title "*My Shiny New Title*" will result in a handle called **my-shiny-new-title**.
{{ '/themes/handle-3.jpg' | image }}
The handle will also determine the URL of that object. For example, a page with the handle "about-us" would have the url: [http://yourshop.myshopify.com/pages/about-us](http://yourshop.myshopify.com/pages/about-us)
Shop designs often rely on a static handle for a page, product, or linklist. In order to preserve design elements and avoid broken links, if you modify the title of an object, **Shopify will not automatically update the handle.**
For example, if you were to change your page title from "About Us" to "About Shopify" ...
{{ '/themes/handle-4.jpg' | image }}
... your handle will still be **about-us**.
{{ '/themes/handle-5.jpg' | image }}
However, you can change an object's handle manually by changing the value for the "URL & Handle" text box.
{{ '/themes/handle-6.jpg' | image }}
{% anchor_link "Accessing attributes via the handle", "attributes-handle" %}
In many cases you may know the handle of a object whose attributes you want to access. You can access its attributes by pluralizing the name of the object, then using either the square bracket ( [ ] ) or dot ( . ) notation.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ pages.about-us.title }}
{{ pages["about-us"].title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
About Us
About Us
{% endraw %}{% endhighlight %}
</div>
In the example above, notice that we are using <code>pages</code> as opposed to <code>page</code>.
You can also pass in Theme Settings objects using this notation. This is handy for theme designers who wish to give the users of their themes the ability to select which content to display in their theme.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections[settings.home_featured_collection].products %}
{{ product.title }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Awesome Shoes
Cool T-Shirt
Wicked Socks
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,74 +0,0 @@
---
layout: default
title: Basics
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Introduction
Liquid is an open-source, Ruby-based template language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts.
<iframe width="560" height="315" src="//www.youtube.com/embed/tZLTExLukSg" frameborder="0" allowfullscreen style="margin: 0 auto 24px auto; width: 70%; display: block; padding: 20px 15%; background: #f9f9f9;"></iframe>
Liquid uses a combination of _tags_, _objects_, and _filters_ to load dynamic content. They are used inside Liquid _template files_, which are a group of files that make up a theme. For more information on the available templates, please see <a href="/themes/theme-development/templates/">Theme Development</a>.
{% table_of_contents %}
{% anchor_link "Tags", "tags" %}
Tags make up the programming logic that tells templates what to do.
{% highlight html %}{% raw %}
{% if user.name == 'elvis' %}
Hey Elvis
{% endif %}
{% endraw %}{% endhighlight %}
<p class="tr">
<a class="themes-article-cta" href="/themes/liquid-documentation/tags">Read more &rsaquo;</a>
</p>
{% anchor_link "Objects", "objects" %}
Objects contain attributes that are used to display dynamic content on the page.
{% highlight html %}{% raw %}
{{ product.title }} <!-- Output: Awesome T-Shirt-->
{% endraw %}{% endhighlight %}
<p class="tr">
<a class="themes-article-cta" href="/themes/liquid-documentation/objects">Read more &rsaquo;</a>
</p>
{% anchor_link "Filters", "filters" %}
Filters are used to modify the output of strings, numbers, variables, and objects.
{% highlight html %}{% raw %}
{{ 'sales' | append: '.jpg' }} <!-- Output: sales.jpg -->
{% endraw %}{% endhighlight %}
<p class="tr">
<a class="themes-article-cta" href="/themes/liquid-documentation/filters">Read more &rsaquo;</a>
</p>

View File

@@ -1,134 +0,0 @@
---
layout: default
title: Operators
nav:
group: Liquid Variables
weight: 3
---
# Operators
<a id="topofpage"></a>
Liquid has access to all of the logical and comparison operators. These can be used in tags such as <a href="/themes/liquid-documentation/tags/control-flow-tags/#if">if</a> and <a href="/themes/liquid-documentation/tags/control-flow-tags/#unless">unless</a>.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "Basic Operators", "basic-operators" %}
<table>
<tbody>
<tr>
<td><pre>==</pre></td>
<td>equals</td>
</tr>
<tr>
<td><pre>!=</pre></td>
<td>does not equal</td>
</tr>
<tr>
<td><pre>></pre></td>
<td>greater than</td>
</tr>
<tr>
<td><pre>&lt;</pre></td>
<td>less than</td>
</tr>
<tr>
<td><pre>>=</pre></td>
<td>greater than or equal to</td>
</tr>
<tr>
<td><pre>&lt;=</pre></td>
<td>less than or equal to</td>
</tr>
<tr>
<td><pre>or</pre></td>
<td>condition A <strong>or</strong> condition B</td>
</tr>
<tr>
<td><pre>and</pre></td>
<td>condition A <strong>and</strong> condition B</td>
</tr>
</tbody>
</table>
**Examples:**
<div>
{% highlight html %}{% raw %}
{% if product.title == "Awesome Shoes" %}
These shoes are awesome!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
Operators can be chained together.
<div>
{% highlight html %}{% raw %}
{% if product.type == "Shirt" or product.type == "Shoes" %}
This is a shirt or a shoe.
{% endif %}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "The 'contains' Operator", "contains" %}
<code>contains</code> checks for the presence of a substring inside a string.
{% highlight html %}{% raw %}
{% if product.title contains 'Pack' %}
This product's title contains the word Pack.
{% endif %}
{% endraw %}{% endhighlight %}
<code>contains</code> can also check for the presence of a string in an array of strings.
{% highlight html %}{% raw %}
{% if product.tags contains 'Hello' %}
This product has been tagged with 'Hello'.
{% endif %}
{% endraw %}{% endhighlight %}
You **cannot** check for the presence of an object in an array of objects using contains. This will not work:
{% highlight html %}{% raw %}
{% if product.collections contains 'Sale' %}
One of the collections this product belongs to is the Sale collection.
{% endif %}
{% endraw %}{% endhighlight %}
This will work:
{% highlight html %}{% raw %}
{% assign in_sale_collection = false %}
{% for collection in product.collections %}
{% if in_sale_collection == false and collection.title == 'Sale' %}
{% assign in_sale_collection = true %}
{% endif %}
{% endfor %}
{% if in_sale_collection %}
One of the collections this product belongs to is the Sale collection.
{% endif %}
{% endraw %}{% endhighlight %}

View File

@@ -1,125 +0,0 @@
---
layout: default
title: Truthy and Falsy
nav:
group: Liquid Variables
weight: 6
---
# Truthy and Falsy in Liquid
In programming, we describe “truthy” and “falsy” as anything that returns true or false, respectively, when used inside an if statement.
## What is truthy?
All values in Liquid are truthy, with the exception of <tt>nil</tt> and <tt>false</tt>.
In the example below, the text “Tobi” is not a boolean, but it is truthy in a conditional:
{% highlight html %}{% raw %}
{% assign tobi = 'Tobi' %}
{% if tobi %}
This will always be true.
{% endif %}
{% endraw %}{% endhighlight %}
[Strings](/themes/liquid-documentation/basics/types/#strings), even when empty, are truthy. The example below will result in empty HTML tags if <code>settings.fp_heading</code> is empty:
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% if settings.fp_heading %}
<h1>{{ settings.fp_heading }}</h1>
{% endif %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}{% raw %}
<h1></h1>
{% endraw %}{% endhighlight %}
To avoid this, you can check to see if the string is <code>blank</code>, as follows:
<div>
{% highlight html %}{% raw %}
{% unless settings.fp_heading == blank %}
<h1>{{ settings.fp_heading }}</h1>
{% endunless %}
{% endraw %}{% endhighlight %}
</div>
<hr/>
An [EmptyDrop](/themes/liquid-documentation/basics/types/#empty-drop) is also truthy. In the example below, if <code>settings.page</code> is an empty string or set to a hidden or deleted object, you will end up with an EmptyDrop. The result is an undesirable empty &lt;div&gt;:
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% if pages[settings.page] %}
<div>{{ pages[settings.page].content }}</div>
{% endif %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}{% raw %}
<div></div>
{% endraw %}{% endhighlight %}
## What is falsy?
The only values that are falsy in Liquid are <tt>nil</tt> and <tt>false</tt>.
[nil](/themes/liquid-documentation/basics/types/#nil) is returned when a Liquid object doesn't have anything to return. For example, if a collection doesn't have a collection image, collection.image will be set to <tt>nil</tt>. Since that is “falsy”, you can do this:
{% highlight html %}{% raw %}
{% if collection.image %}
<!-- output collection image -->
{% endif %}
{% endraw %}{% endhighlight %}
The value <tt>false</tt> is returned through many Liquid object properties such as <tt>product.available</tt>.
## Summary
The table below summarizes what is truthy or falsy in Liquid.
| | truthy | falsy |
| ------------- |:-------------:|:-------------:|
| true | &times; | |
| false | | &times; |
| nil | | &times; |
| string | &times; | |
| empty string | &times; | |
| 0 | &times; | |
| 1 or 2 or 3.14 | &times; | |
| array | &times; | |
| empty array | &times; | |
| collection | &times; | |
| collection with no products | &times; | |
| page | &times; | |
| EmptyDrop | &times; | |

View File

@@ -1,227 +0,0 @@
---
layout: default
title: Types
nav:
group: Liquid Variables
weight: 4
---
# Types
Liquid objects can return one of six types: String, Number, Boolean, Nil, Array, or EmptyDrop. Liquid variables can be initialized by using the <a href="/themes/liquid-documentation/tags/variable-tags/#assign">assign</a> or <a href="/themes/liquid-documentation/tags/variable-tags/#capture">capture</a> tags.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "Strings", "strings" %}
Strings are declared by wrapping the variable's value in single or double quotes. The <a href="/themes/liquid-documentation/filters/string-filters/#to_number">to_number</a> filter can be used to convert a string into a number.
<div>
{% highlight html %}{% raw %}
{% assign my_string = "Hello World!" %}
{% endraw %}{% endhighlight %}
</div>
<a id="topofpage"></a>
{% anchor_link "Numbers", "numbers" %}
Numbers include floats and integers.
<div>
{% highlight html %}{% raw %}
{% assign my_num = 25 %}
{% endraw %}{% endhighlight %}
</div>
<a id="topofpage"></a>
{% anchor_link "Booleans", "booleans" %}
Booleans are either true or false. No quotations are necessary when declaring a boolean.
<div>
{% highlight html %}{% raw %}
{% assign foo = true %}
{% assign bar = false %}
{% endraw %}{% endhighlight %}
</div>
<a id="topofpage"></a>
{% anchor_link "Nil", "nil" %}
Nil is an empty value that is returned when Liquid code has no results. It is **not** a string with the characters "nil".
Nil is treated as false in the conditions of &#123;% if %&#125; blocks and other Liquid tags that check for the truthfulness of a statement. The example below shows a situation where a fulfillment does not yet have a tracking number entered. The if statement would not render the included text within it.
{% highlight html %}{% raw %}
{% if fulfillment.tracking_numbers %}
We have a tracking number!
{% endif %}
{% endraw %}{% endhighlight %}
Any tags or outputs that return nil will not show anything on the screen.
<p class="input">Input</p>
{% highlight html %}{% raw %}
Tracking number: {{ fulfillment.tracking_numbers }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Tracking number:
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "Arrays", "arrays" %}
Arrays hold a list of variables of all types.
#### Accessing all items in an array
To access items in an array, you can loop through each item in the array using a <a href="/themes/liquid-documentation/tags/#for">for</a> tag or a <a href="/themes/liquid-documentation/tags/#tablerow">tablerow</a> tag.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if product.tags = "sale", "summer", "spring", "wholesale" -->
{% for tag in product.tags %}
{{ tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
sale summer spring wholesale
{% endraw %}{% endhighlight %}
</div>
#### Accessing a specific item in an array
You can use square brackets ( [ ] ) notation to access a specific item in an array. Array indexing starts at zero.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if product.tags = "sale", "summer", "spring", "wholesale" -->
{{ product.tags[0] }}
{{ product.tags[1] }}
{{ product.tags[2] }}
{{ product.tags[3] }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
sale
summer
spring
wholesale
{% endraw %}{% endhighlight %}
</div>
#### Initializing an array
It is not possible to initialize an array in Liquid. For example, in Javascript you could do something like this:
<div>
{% highlight html %}{% raw %}
<script>
var cars = ["Saab", "Volvo", "BMW"];
</script>
{% endraw %}{% endhighlight %}
</div>
In Liquid, you must instead use the <code>split</code> filter to break a single string into an array of substrings. See <a href="/themes/liquid-documentation/filters/string-filters/#split">here</a> for examples.
{% anchor_link "EmptyDrop", "empty-drop" %}
An EmptyDrop object is returned whenever you try to access a non-existent object (for example, a collection, page or blog that was deleted or hidden) by [handle](/themes/liquid-documentation/basics/handle). In the example below, <code>page_1</code>, <code>page_2</code> and <code>page_3</code> are all EmptyDrop objects.
{% highlight html %}{% raw %}
{% assign variable = "hello" %}
{% assign page_1 = pages[variable] %}
{% assign page_2 = pages["i-do-not-exist-in-your-store"] %}
{% assign page_3 = pages.this-handle-does-not-belong-to-any-page %}
{% endraw %}{% endhighlight %}
EmptyDrop objects only have one attribute, <code>empty?</code>, which is always true.
Collections and pages that _do_ exist do not have an <code>empty?</code> attribute. Their <code>empty?</code> is “falsy”, which means that calling it inside an if statement will return <tt>false</tt>. When using an unless statement on existing collections and pages, <code>empty?</code> will return <tt>true</tt>.
#### Applications in themes
Using the <code>empty?</code> attribute, you can check to see if a page exists or not _before_ accessing any of its other attributes.
{% highlight html %}{% raw %}
{% unless pages.frontpage.empty? %}
<!-- We have a page with handle 'frontpage' and it's not hidden.-->
<h1>{{ pages.frontpage.title }}</h1>
<div>{{ pages.frontpage.content }}</div>
{% endunless %}
{% endraw %}{% endhighlight %}
It is important to see if a page exists or not first to avoid outputting empty HTML elements to the page, as follows:
{% highlight html %}{% raw %}
<h1></h1>
<div></div>
{% endraw %}{% endhighlight %}
You can perform the same verification with collections as well:
{% highlight html %}{% raw %}
{% unless collections.frontpage.empty? %}
{% for product in collections.frontpage.products %}
{% include 'product-grid-item' %}
{% else %}
<p>We do have a 'frontpage' collection but it's empty.</p>
{% endfor %}
{% endunless %}
{% endraw %}{% endhighlight %}

View File

@@ -1,598 +0,0 @@
---
layout: default
title: Additional Filters
nav:
group: Filters
weight: 10
---
# Additional Filters
General filters serve many different purposes including formatting, converting, and applying CSS classes.
{% table_of_contents %}
{% anchor_link "date", "date" %}
<p>Converts a timestamp into another date format.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%a, %b %d, %y" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Tue, Apr 22, 14
{% endraw %}{% endhighlight %}
</div>
<p>The date parameters are listed below:</p>
<table class="filter-date-table">
<tbody>
<tr>
<td><pre>%a</pre></td>
<td><p>Abbreviated weekday.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%a" }}
<!-- Sat -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%A</pre></td>
<td><p>Full weekday name.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%A" }}
<!-- Tuesday -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%b</pre></td>
<td><p>Abbreviated month name.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%b" }}
<!-- Jan -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%B</pre></td>
<td><p>Full month name</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%B" }}
<!-- January -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%c</pre></td>
<td><p>Preferred local date and time representation</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%c" }}
<!-- Tue Apr 22 11:16:09 2014 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%d</pre></td>
<td><p>Day of the month, zero-padded (01, 02, 03, etc.).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%d" }}
<!-- 04 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%-d</pre></td>
<td><p>Day of the month, not zero-padded (1,2,3, etc.).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%-d" }}
<!-- 4 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%D</pre></td>
<td><p>Formats the date (dd/mm/yy).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%D" }}
<!-- 04/22/14 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%e</pre></td>
<td>
<p>Day of the month, blank-padded ( 1, 2, 3, etc.).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%e" }}
<!-- 3 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%F</pre></td>
<td>
<p>Returns the date in ISO 8601 format (yyyy-mm-dd).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%F" }}
<!-- 2014-04-22 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%H</pre></td>
<td><p>Hour of the day, 24-hour clock (00 - 23).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%H" }}
<!-- 15 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%I</pre></td>
<td><p>Hour of the day, 12-hour clock (1 - 12).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%I" }}
<!-- 7 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%j</pre></td>
<td><p>Day of the year (001 - 366).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%j" }}
<!-- 245 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%k</pre></td>
<td><p>Hour of the day, 24-hour clock (1 - 24).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%k" }}
<!-- 14 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%m</pre></td>
<td><p>Month of the year (01 - 12).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%m" }}
<!-- 04 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%M</pre></td>
<td><p>Minute of the hour (00 - 59).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%M" }}
<!--53-->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%p</pre></td>
<td><p>Meridian indicator (AM/PM).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%p" }}
<!-- PM -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%r</pre></td>
<td><p>12-hour time (%I:%M:%S %p)</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%r" }}
<!-- 03:20:07 PM -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%r</pre></td>
<td><p>12-hour time (%I:%M:%S %p)</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%r" }}
<!-- 03:20:07 PM -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%R</pre></td>
<td><p>24-hour time (%H:%M)</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%R" }}
<!-- 15:21 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%T</pre></td>
<td><p>24-hour time (%H:%M:%S)</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%T" }}
<!-- 15:22:13 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%U</pre></td>
<td>The number of the week in the current year, starting with the first Sunday as the first day of the first week.
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%U" }}
<!-- 16 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%W</pre></td>
<td><p>The number of the week in the current year, starting with the first Monday as the first day of the first week.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%W" }}
<!-- 16 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%w</pre></td>
<td><p>Day of the week (0 - 6, with Sunday being 0).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%w" }}
<!-- 2 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%x</pre></td>
<td><p>Preferred representation for the date alone, no time. (mm/dd/yy).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%x" }}
<!-- 04/22/14 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%X</pre></td>
<td><p>Preferred representation for the time. (hh:mm:ss). </p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%X" }}
<!-- 13:17:24 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%y</pre></td>
<td><p>Year without a century (00.99).</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%y" }}
<!-- 14 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%Y</pre></td>
<td><p>Year with a century.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%Y" }}
<!-- 2014 -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
<tr>
<td><pre>%Z</pre></td>
<td><p>Time zone name.</p>
<div>
{% highlight html %}{% raw %}
{{ article.published_at | date: "%Z" }}
<!-- EDT -->
{% endraw %}{% endhighlight %}
</div>
</td>
</tr>
</tbody>
</table>
{% anchor_link "default", "default" %}
Sets a default value for any variable with no assigned value. Can be used with strings, arrays, and hashes.
<p class="input">Input</p>
{% highlight html %}{% raw %}
Dear {{ customer.name | default: "customer" }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- if customer.name is nil -->
Dear customer
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "default_errors", "default_errors" %}
Outputs default error messages for the <a href="/themes/liquid-documentation/objects/form/#form.errors">form.errors</a> variable. The messages returned are dependent on the strings returned by <code>form.errors</code>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% if form.errors %}
{{ form.errors | default_errors }}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- if form.errors returned "email" -->
Please enter a valid email address.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "default_pagination", "default_pagination" %}
Creates a set of links for paginated results. Used in conjunction with the <a href="/themes/liquid-documentation/objects/paginate/">paginate</a> variable.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ paginate | default_pagination }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<span class="page current">1</span>
<span class="page"><a href="/collections/all?page=2" title="">2</a></span>
<span class="page"><a href="/collections/all?page=3" title="">3</a></span>
<span class="deco">&hellip;</span>
<span class="page"><a href="/collections/all?page=17" title="">17</a></span>
<span class="next"><a href="/collections/all?page=2" title="">Next &raquo;</a></span>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "highlight", "highlight" %}
Wraps words inside search results with an HTML <code>&#60;strong&#62;</code> tag with the class <code>highlight</code> if it matches the submitted <a href="/themes/liquid-documentation/objects/search/#search.terms">search.terms</a>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ item.content | highlight: search.terms }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- If the search term was "Yellow" -->
<strong class="highlight">Yellow</strong> shirts are the best!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "highlight_active_tag", "highlight_active_tag" %}
<p>Wraps a tag link in a <code>&#60;span&#62;</code> with the class <code>active</code> if that tag is being used to filter a collection.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- collection.tags = ["Cotton", "Crew Neck", "Jersey"] -->
{% for tag in collection.tags %}
{{ tag | highlight_active | link_to_tag: tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a title="Show products matching tag Cotton" href="/collections/all/cotton"><span class="active">Cotton</span></a>
<a title="Show products matching tag Crew Neck" href="/collections/all/crew-neck">Crew Neck</a>
<a title="Show products matching tag Jersey" href="/collections/all/jersey">Jersey</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "json", "json" %}
Converts a string into JSON format.
<p class="input">Input</p>
{% highlight html%}{% raw %}
var content = {{ pages.page-handle.content | json }};
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
var content = "\u003Cp\u003E\u003Cstrong\u003EYou made it! Congratulations on starting your own e-commerce store!\u003C/strong\u003E\u003C/p\u003E\n\u003Cp\u003EThis is your shop\u0026#8217;s \u003Cstrong\u003Efrontpage\u003C/strong\u003E, and it\u0026#8217;s the first thing your customers will see when they arrive. You\u0026#8217;ll be able to organize and style this page however you like.\u003C/p\u003E\n\u003Cp\u003E\u003Cstrong\u003ETo get started adding products to your shop, head over to the \u003Ca href=\"/admin\"\u003EAdmin Area\u003C/a\u003E.\u003C/strong\u003E\u003C/p\u003E\n\u003Cp\u003EEnjoy the software, \u003Cbr /\u003E\nYour Shopify Team.\u003C/p\u003E";
{% endraw %}{% endhighlight %}
</div>
{% block "note-information" %}
<p>You do not have to wrap the Liquid output in quotations - the <code>json</code> filter will add them in. The <code>json</code> filter will also escape quotes as needed inside the output.</p>
{% endblock %}
<p>The <code>json</code> filter can also used to make Liquid objects readable by JavaScript:</p>
{% highlight html%}{% raw %}
var json_product = {{ collections.featured.products.first | json }};
var json_cart = {{ cart | json }};
{% endraw %}{% endhighlight %}
{% anchor_link "weight_with_unit", "weight_with_unit" %}
<p>Formats the product variant's weight. The weight unit is set in <a href="http://www.shopify.com/admin/settings/general">General Settings</a>.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ product.variants.first.weight | weight_with_unit }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
24.0 kg
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,245 +0,0 @@
---
layout: default
title: Array Filters
nav:
group: Filters
weight: 4
---
# Array Filters
Array filters are used to modify the output of arrays.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "join", "join" %}
<p>Joins the elements of an array with the character passed as the parameter. The result is a single string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ product.tags | join: ', ' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
tag1, tag2, tag3
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "first", "first" %}
<p>Returns the first element of an array.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.tags = "sale", "mens", "womens", "awesome" -->
{{ product.tags | first }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
sale
{% endraw %}{% endhighlight %}
</div>
<code>first</code> can be used in dot notation, in cases where it needs to be used inside a <a href="/themes/liquid-documentation/tags/">tag</a>.
<div>
{% highlight html %}{% raw %}
{% if product.tags.first == "sale" %}
This product is on sale!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
Using <code>first</code> on a string returns the first character in the string.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Shoes" -->
{{ product.title | first }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
A
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "last", "last" %}
<p>Gets the last element passed in an array.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.tags = "sale", "mens", "womens", "awesome" -->
{{ product.tags | last }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
awesome
{% endraw %}{% endhighlight %}
</div>
<code>last</code> can be used in dot notation, in cases where it needs to be used inside a <a href="/themes/liquid-documentation/tags/">tag</a>.
<div>
{% highlight html %}{% raw %}
{% if product.tags.last == "sale"%}
This product is on sale!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
Using <code>last</code> on a string returns the last character in the string.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Shoes" -->
{{ product.title | last }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
s
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "map", "map" %}
Accepts an array element's attribute as a parameter and creates a string out of each array element's value.
<p class="input">Input</p>
{% highlight html %}{% raw %}
<!-- collection.title = "Spring", "Summer", "Fall", "Winter" -->
{% assign collection_titles = collections | map: 'title' %}
{{ collection_titles }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
SpringSummerFallWinter
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "size", "size" %}
<p>Returns the size of a string or an array.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'this is a 30 character string' | size }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
30
{% endraw %}{% endhighlight %}
</div>
<code>size</code> can be used in dot notation, in cases where it needs to be used inside a <a href="/themes/liquid-documentation/tags/">tag</a>.
<div>
{% highlight html %}{% raw %}
{% if collections.frontpage.products.size > 10 %}
There are more than 10 products in this collection!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "sort", "sort" %}
Sorts the elements of an array by a given attribute of an element in the array.
<div>
{% highlight html %}{% raw %}
{% assign products = collection.products | sort: 'price' %}
{% for product in products %}
<h4>{{ product.title }}</h4>
{% endfor %}
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,108 +0,0 @@
---
layout: default
title: HTML Filters
nav:
group: Filters
weight: 4
---
#HTML Filters
HTML filters wrap assets in HTML tags.
{% table_of_contents %}
{% anchor_link "img_tag", "img_tag" %}
<p>Generates an image tag.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'smirking_gnome.gif' | asset_url | img_tag }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<img src="//cdn.shopify.com/s/files/1/0147/8382/t/15/assets/smirking_gnome.gif?v=1384022871" alt="" />
{% endraw %}{% endhighlight %}
</div>
<code>img_tag</code> accepts parameters to output an alt tag and class names. The first parameter is output as the alt text, and any other following parameters are output as CSS classes.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'smirking_gnome.gif' | asset_url | img_tag: 'Smirking Gnome', 'cssclass1 cssclass2' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<img src="//cdn.shopify.com/s/files/1/0147/8382/t/15/assets/smirking_gnome.gif?v=1384022871" alt="Smirking Gnome" class="cssclass1 cssclass2" />
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "script_tag", "script_tag" %}
<p>Generates a script tag.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'shop.js' | asset_url | script_tag }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<script src="//cdn.shopify.com/s/files/1/0087/0462/t/394/assets/shop.js?28178" type="text/javascript"></script>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "stylesheet_tag", "stylesheet_tag" %}
<p>Generates a stylesheet tag.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'shop.css' | asset_url | stylesheet_tag }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<link href="//cdn.shopify.com/s/files/1/0087/0462/t/394/assets/shop.css?28178" rel="stylesheet" type="text/css" media="all" />
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,55 +0,0 @@
---
layout: default
title: Filters
landing_as_article: true
nav:
group: Liquid Documentation
weight: 3
---
# Filters
Filters are simple methods that modify the output of numbers, strings, variables and objects. They are placed within an output tag <code>&#123;&#123;</code> <code>&#125;&#125;</code> and are separated with a pipe character <code>|</code>.
<p class="input">Input</p>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Shoes" -->
{{ product.title | upcase }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
AWESOME SHOES
{% endraw %}{% endhighlight %}
</div>
In the example above, `product` is the object, `title` is its attribute, and `upcase` is the filter being applied.
Some filters require a parameter to be passed.
<p class="input">Input</p>
<!-- product.title = "Awesome Shoes" -->
{% highlight html %}{% raw %}
{{ product.title | remove: "Awesome" }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}{% raw %}
Shoes
{% endraw %}{% endhighlight %}
Multiple filters can be used on one output. They are applied from left to right.
<p class="input">Input</p>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Shoes" -->
{{ product.title | upcase | remove: "AWESOME" }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}{% raw %}
SHOES
{% endraw %}{% endhighlight %}

View File

@@ -1,244 +0,0 @@
---
layout: default
title: Math Filters
nav:
group: Filters
weight: '4'
---
# Math Filters
Math filters allow you to apply mathematical tasks.
Math filters can be linked and, as with any other filters, are applied in order of left to right. In the example below, <code>minus</code> is applied first, then <code>times</code>, and finally <code>divided_by</code>.
<div>
{% highlight html %}{% raw %}
You save {{ product.compare_at_price | minus: product.price | times: 100.0 | divided_by: product.compare_at_price }}%
{% endraw %}{% endhighlight %}
</div>
{% table_of_contents %}
{% anchor_link "ceil", "ceil" %}
Rounds an output up to the nearest integer.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 4.6 | ceil }}
{{ 4.3 | ceil }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
5
5
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "divided_by", "divided_by" %}
<p>Divides an output by a number.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.price = 200 -->
{{ product.price | divided_by: 10 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
20
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "floor", "floor" %}
Rounds an output down to the nearest integer.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 4.6 | floor }}
{{ 4.3 | floor }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
4
4
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "minus", "minus" %}
<p>Subtracts a number from an output.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.price = 200 -->
{{ product.price | minus: 15 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
185
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "plus", "plus" %}
<p>Adds a number to an output.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.price = 200 -->
{{ product.price | plus: 15 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
215
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "round", "round" %}
Rounds the output to the nearest integer or specified number of decimals.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 4.6 | round }}
{{ 4.3 | round }}
{{ 4.5612 | round: 2 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
5
4
4.56
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "times", "times" %}
<p>Multiplies an output by a number.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.price = 200 -->
{{ product.price | time: 1.15 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
230
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "modulo", "modulo" %}
<p>Divides an output by a number and returns the remainder.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 12 | modulo:5 }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
2
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,101 +0,0 @@
---
layout: default
title: Money Filters
nav:
group: Filters
weight: '4'
---
# Money Filters
Money filters format prices based on the **Currency Formatting** found in <a href="http://www.shopify.com/admin/settings/general">General Settings</a>.
{{ '/themes/money_format_settings.jpg' | image }}
{% table_of_contents %}
{% anchor_link "money", "money" %}
<p>Formats the price based on the shop's <strong>HTML without currency</strong> setting.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 145 | money }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
<!-- if "HTML without currency" is ${{ amount }} -->
$1.45
<!-- if "HTML without currency" is €{{ amount_no_decimals }} -->
€1
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "money_with_currency", "money_with_currency" %}
<p>Formats the price based on the shop's <strong>HTML with currency</strong> setting.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 1.45 | money_with_currency }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- if "HTML with currency" is ${{ amount }} CAD -->
$1.45 CAD
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "money_without_currency", "money_without_currency" %}
<p>Formats the price using a decimal.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 145 | money_without_currency }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
1.45
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,682 +0,0 @@
---
layout: default
title: String Filters
nav:
group: Filters
weight: '4'
---
# String Filters
String filters are used to manipulate outputs and variables of the <a href="/themes/liquid-documentation/basics/types/#strings">string</a> type.
{% table_of_contents %}
{% anchor_link "append", "append" %}
<p>Appends characters to a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'sales' | append: '.jpg' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
sales.jpg
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "camelcase", "camelcase" %}
<p>Converts a string into CamelCase.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'coming-soon' | camelcase }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
ComingSoon
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "capitalize", "capitalize" %}
<p>Capitalizes the first word in a string</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'capitalize me' | capitalize }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Capitalize me
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "downcase", "downcase" %}
<p>Converts a string into lowercase.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'UPPERCASE' | downcase }}
{% endraw %}{% endhighlight %}
</div>
**Ouput**
<div>
{% highlight html%}{% raw %}
uppercase
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "escape", "escape" %}
<p>Escapes a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "<p>test</p>" | escape }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- The <p> tags are not rendered -->
<p>test</p>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "handle/handleize", "handle" %}
Formats a string into a <a href="/themes/liquid-documentation/basics/handle/">handle</a>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ '100% M & Ms!!!' | handleize }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
100-m-ms
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "md5", "md5" %}
Converts a string into an MD5 hash.
<p>An example use case for this filter is showing the Gravatar image associated with the poster of a blog comment:</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
<img src="http://www.gravatar.com/avatar/{{ comment.email | remove: ' ' | strip_newlines | downcase | md5 }}" />
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<img src="http://www.gravatar.com/avatar/2a95ab7c950db9693c2ceb767784c201" />
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "newline_to_br", "newline_to_br" %}
<p>Inserts a &lt;br &gt; linebreak HTML tag in front of each line break in a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% capture var %}
One
Two
Three
{% endcapture %}
{{ var | newline_to_br }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
One <br>
Two<br>
Three<br>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "pluralize", "pluralize" %}
Outputs the singular or plural version of a string based on the value of a number. The first parameter is the singular string and the second parameter is the plural string.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ cart.item_count }}
{{ cart.item_count | pluralize: 'item', 'items' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
3 items
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "prepend", "prepend" %}
<p>Prepends characters to a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'sale' | prepend: 'Made a great ' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
Made a great sale
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "remove", "remove" %}
<p>Removes all occurrences of a substring from a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "Hello, world. Goodbye, world." | remove: "world" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hello, . Goodbye, .
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "remove_first", "remove_first" %}
<p>Removes only the first occurrence of a substring from a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "Hello, world. Goodbye, world." | remove_first: "world" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hello, . Goodbye, world.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "replace", "replace" %}
<p>Replaces all occurrences of a string with a substring.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Shoes" -->
{{ product.title | replace: 'Awesome', 'Mega' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Mega Shoes
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "replace_first", "replace_first" %}
<p>Replaces the first occurrence of a string with a substring.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- product.title = "Awesome Awesome Shoes" -->
{{ product.title | replace_first: 'Awesome', 'Mega' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Mega Awesome Shoes
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "split", "split" %}
The <code>split</code> filter takes on a substring as a parameter. The substring is used as a delimiter to divide a string into an array.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign words = "Uses cheat codes, calls the game boring." | split: ' ' %}
First word: {{ words.first }}
First word: {{ words[0] }}
Second word: {{ words[1] }}
Last word: {{ words.last }}
All words: {{ words | join: ', ' }}
{% for word in words %}
{{ word }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
First word: Uses
First word: Uses
Second word: cheat
Last word: boring.
All words: Uses, cheat, codes,, calls, the, game, boring.
Uses cheat codes, calls the game boring.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "strip", "strip" %}
<p>Strips tabs, spaces, and newlines (all whitespace) from the left and right side of a string. </p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ ' too many spaces ' | strip }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
too many spaces
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "lstrip", "lstrip" %}
<p>Strips tabs, spaces, and newlines (all whitespace) from the <strong>left</strong> side of a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
"{{ ' too many spaces ' | lstrip }}"
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- Notice the empty spaces to the right of the string -->
too many spaces
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "rstrip", "rstrip" %}
<p>Strips tabs, spaces, and newlines (all whitespace) from the <strong>right</strong> side of a string. </p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ ' too many spaces ' | strip }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
<!-- Notice the empty spaces to the right of the string -->
{% highlight html %}{% raw %}
too many spaces
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "strip_html", "strip_html" %}
<p>Strips all HTML tags from a string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "<h1>Hello</h1> World" | strip_html }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hello World
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "strip_newlines", "strip_newlines" %}
<p>Removes any line breaks/newlines from a string.</p>
<div>
{% highlight html %}{% raw %}
{{ product.description | strip_newlines }}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "to_number", "to_number" %}
<p>Converts a string into a number.</p>
<p><strong>Note</strong>: when you define a variable using the <a href="/themes/liquid-documentation/tags/variable-tags/#capture">capture</a> tag, the result is always a string. Theme Settings variables are also strings by default.
<p>For example, the following will produce an error, since the <code>num</code> variable is still a string:</p>
<div>
{% highlight html %}{% raw %}
{% capture num %}10000{% endcapture %}
{% if num > 9000 %}
num is over 9000!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>By using the <code>to_number</code> filter on the <code>num</code> variable, it can be compared to another number.
<div>
{% highlight html %}{% raw %}
{% capture num %}10000{% endcapture %}
{% if num | to_number > 9000 %}
num is over 9000!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "truncate", "truncate" %}
<p>Truncates a string down to 'x' characters, where x is the number passed as a parameter. An ellipsis (...) is appended to the string and is included in the character count.</p>
<div>
{% highlight html %}{% raw %}
{{ "The cat came back the very next day" | truncate: 10 }}
{% endraw %}{% endhighlight %}
</div>
<div>
{% highlight html %}{% raw %}
The cat...
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "truncatewords", "truncatewords" %}
<p>Truncates a string down to 'x' words, where x is the number passed as a parameter. An ellipsis (...) is appended to the truncated string.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "The cat came back the very next day" | truncatewords: 4 }}{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
The cat came back...
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "upcase", "upcase" %}
<p>Converts a string into uppercase.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'i want this to be uppercase' | upcase }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html%}{% raw %}
I WANT THIS TO BE UPPERCASE
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "url_escape", "url_escape" %}
Identifies all characters in a string that are not allowed in URLS, and replaces the characters with their escaped variants.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ "<hello> & <shopify>" | url_escape }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
%3Chello%3E%20&%20%3Cshopify%3E
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "url_param_escape", "url_param_escape" %}
<p>Replaces all characters in a string that are not allowed in URLs with their escaped variants, including the ampersand (&).</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ "<hello> & <shopify>" | url_param_escape }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
%3Chello%3E%20%26%20%3Cshopify%3E
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,695 +0,0 @@
---
layout: default
title: URL Filters
nav:
group: Filters
weight: '4'
---
# URL Filters
URL filters output links to assets on Shopify's Content Delivery Network (CDN). They are also used to create links for filtering collections and blogs.
In many URL filters' outputs, you will see a question mark (?) with a number appended to the asset's file path. This is the file's version number.
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/t/394/assets/shop.css?28253
{% endraw %}{% endhighlight %}
</div>
In the example above, <strong>28253</strong> is the version number. URL filters will always load the latest version of an asset.
{% table_of_contents %}
{% anchor_link "asset_url", "asset_url" %}
Returns the URL of a file in the "assets" folder of a theme.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'shop.css' | asset_url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/t/394/assets/shop.css?28253
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "file_url", "file_url" %}
<p>Returns the URL of a file in the <a href="http://www.shopify.com/admin/settings/files">Files</a> page of the admin.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'size-chart.pdf' | file_url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/files/size-chart.pdf?28261
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_login_link", "customer_login_link" %}
Generates a link to the customer log in page.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ 'Log in' | customer_login_link }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/account/login" id="customer_login_link">Log in</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "global_asset_url", "global_asset_url" %}
Returns the URL of a global asset. Global assets are kept in a directory on Shopify's servers. Using global assets can improve the load times of your pages dramatically.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'prototype.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<script src="//cdn.shopify.com/s/global/prototype.js?1" type="text/javascript"></script>
{% endraw %}{% endhighlight %}
</div>
Listed below are the available global assets:
{% highlight html %}{% raw %}
{{ 'prototype.js' | global_asset_url | script_tag }}
{{ 'controls.js' | global_asset_url | script_tag }}
{{ 'dragdrop.js' | global_asset_url | script_tag }}
{{ 'effects.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'prototype/1.5/prototype.js' | global_asset_url | script_tag }}
{{ 'prototype/1.6/prototype.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'scriptaculous/1.8.2/scriptaculous.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/builder.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/controls.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/dragdrop.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/effects.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/slider.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/sound.js' | global_asset_url | script_tag }}
{{ 'scriptaculous/1.8.2/unittest.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'ga.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'mootools.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'lightbox.css' | global_asset_url | stylesheet_tag }}
{{ 'lightbox.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'lightbox/v1/lightbox.css' | global_asset_url | stylesheet_tag }}
{{ 'lightbox/v1/lightbox.js' | global_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'lightbox/v2/lightbox.css' | global_asset_url | stylesheet_tag }}
{{ 'lightbox/v2/lightbox.js' | global_asset_url | script_tag }}
{{ 'lightbox/v2/loading.gif' | global_asset_url }}
{{ 'lightbox/v2/close.gif' | global_asset_url }}
{{ 'lightbox/v2/overlay.png' | global_asset_url }}
{{ 'lightbox/v2/zoom-lg.gif' | global_asset_url }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'lightbox/v204/lightbox.css' | global_asset_url | stylesheet_tag }}
{{ 'lightbox/v204/lightbox.js' | global_asset_url | script_tag }}
{{ 'lightbox/v204/bullet.gif' | global_asset_url }}
{{ 'lightbox/v204/close.gif' | global_asset_url }}
{{ 'lightbox/v204/closelabel.gif' | global_asset_url }}
{{ 'lightbox/v204/donatebutton.gif' | global_asset_url }}
{{ 'lightbox/v204/downloadicon.gif' | global_asset_url }}
{{ 'lightbox/v204/loading.gif' | global_asset_url }}
{{ 'lightbox/v204/nextlabel.gif' | global_asset_url }}
{{ 'lightbox/v204/prevlabel.gif' | global_asset_url }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'list_collection.css' | global_asset_url | stylesheet_tag }}
{{ 'search.css' | global_asset_url | stylesheet_tag }}
{{ 'textile.css' | global_asset_url | stylesheet_tag }}
{% endraw %}{% endhighlight %}
{% highlight html %}{% raw %}
{{ 'firebug/firebug.css' | global_asset_url | stylesheet_tag }}
{{ 'firebug/firebug.js' | global_asset_url | script_tag }}
{{ 'firebug/firebugx.js' | global_asset_url | script_tag }}
{{ 'firebug/firebug.html' | global_asset_url }}
{{ 'firebug/errorIcon.png' | global_asset_url }}
{{ 'firebug/infoIcon.png' | global_asset_url }}
{{ 'firebug/warningIcon.png' | global_asset_url }}
{% endraw %}{% endhighlight %}
{% anchor_link "link_to", "link_to" %}
<p>Generates an HTML link. The first parameter is the URL of the link, and the optional second parameter is the title of the link.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'Shopify' | link_to: 'http://shopify.com','A link to Shopify' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="http://shopify.com" title="A link to Shopify">Shopify</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "link_to_vendor", "link_to_vendor" %}
Creates an HTML link to a collection page that lists all products belonging to a vendor.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "Shopify" | link_to_vendor }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/vendors?q=Shopify" title="Shopify">Shopify</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "link_to_type", "link_to_type" %}
Creates an HTML link to a collection page that lists all products belonging to a product type.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "jeans" | link_to_type }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/types?q=jeans" title="jeans">jeans</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "link_to_tag", "link_to_tag" %}
<p>Creates a link to all products in a collection that have a given tag.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- collection.tags = ["Mens", "Womens", "Sale"] -->
{% for tag in collection.tags %}
{{ tag | link_to_tag: tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a title="Show products matching tag Mens" href="/collections/frontpage/mens">Mens</a>
<a title="Show products matching tag Womens" href="/collections/frontpage/womens">Womens</a>
<a title="Show products matching tag Sale" href="/collections/frontpage/sale">Sale</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "link_to_add_tag", "link_to_add_tag" %}
<p>Creates a link to all products in a collection that have a given tag as well as any tags that have been already selected.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- collection.tags = ["Mens", "Womens", "Sale"] -->
{% for tag in collection.tags %}
{{ tag | link_to_add_tag: tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- If you're on "/collections/frontpage/mens": -->
<a title="Show products matching tag Mens" href="/collections/frontpage/mens">Mens</a>
<a title="Show products matching tag Womens" href="/collections/frontpage/womens+mens">Womens</a>
<a title="Show products matching tag Sale" href="/collections/frontpage/sale+mens">Sale</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "link_to_remove_tag", "link_to_remove_tag" %}
<p>Generates a link to all products in a collection that have the given tag and all the previous tags that might have been added already.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- collection.tags = ["Mens", "Womens", "Sale"] -->
{% for tag in collection.tags %}
{{ tag | link_to_add_tag: tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- If you're on "/collections/frontpage/mens": -->
<a title="Remove tag Mens" href="/collections/frontpage">Mens</a>
<a title="Remove tag Womens" href="/collections/frontpage/mens">Womens</a>
<a title="Remove tag Sale" href="/collections/frontpage/mens">Sale</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "payment_type_img_url", "payment_type_img_url" %}
Returns the URL of the payment type's SVG image. Used in conjunction with the <a href="/themes/liquid-documentation/objects/shop/#shop.enabled_payment_types">shop.enabled_payment_types</a> variable.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% for type in shop.enabled_payment_types %}
<img src="{{ type | payment_type_img_url }}" />
{% endfor %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- If shop accepts American Express, MasterCard and Visa -->
<img src="//cdn.shopify.com/s/global/payment_types/creditcards_american_express.svg?3cdcd185ab8e442b12edc11c2cd13655f56b0bb1">
<img src="//cdn.shopify.com/s/global/payment_types/creditcards_master.svg?3cdcd185ab8e442b12edc11c2cd13655f56b0bb1">
<img src="//cdn.shopify.com/s/global/payment_types/creditcards_visa.svg?3cdcd185ab8e442b12edc11c2cd13655f56b0bb1">
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product_img_url", "product_img_url" %}
<p>Generates the product image URL. Accepts an <a href="/themes/liquid-documentation/filters/url-filters/#size-parameters">image size</a> as a parameter.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ product.featured_image | product_img_url: "medium" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/products/shirt14_medium.jpeg?v=1309278311
{% endraw %}{% endhighlight %}
</div>
The available size parameters are listed below:
<h3 id="size-parameters">Parameters: image sizes</h3>
<table>
<tbody>
<tr id="pico">
<td>
<pre>pico</pre>
</td>
<td>
<p>Returns the image at a maximum size of 16 by 16 pixels.</p>
</td>
</tr>
<tr id="icon">
<td>
<pre>icon </pre>
</td>
<td>
<p>Returns the image at a maximum size of 32 by 32 pixels.</p>
</td>
</tr>
<tr id="thumb">
<td>
<pre>thumb</pre>
</td>
<td>
<p>Returns the image at a maximum size of 50 by 50 pixels.</p>
</td>
</tr>
<tr id="small">
<td>
<pre> small </pre>
</td>
<td>
<p>Returns the image at a maximum size of 100 by 100 pixels.</p>
</td>
</tr>
<tr id="compact">
<td>
<pre> compact </pre>
</td>
<td>
<p>Returns the image at a maximum size of 160 by 160 pixels.</p>
</td>
</tr>
<tr id="medium">
<td>
<pre> medium</pre>
</td>
<td>
<p>Returns the image at a maximum size of 240 by 240 pixels.</p>
</td>
</tr>
<tr id="large">
<td>
<pre> large </pre>
</td>
<td>
<p>Returns the image at a maximum size of 480 by 480 pixels.</p>
</td>
</tr>
<tr id="grande">
<td>
<pre> grande </pre>
</td>
<td>
<p>Returns the image at a maximum size of 600 by 600 pixels.</p>
</td>
</tr>
<tr id="original">
<td>
<pre> original</pre>
</td>
<td>
<p><strong>Deprecated</strong> - do not use this when creating themes. </p>
<p>Returns the image at a maximum size of 1024 by 1024 pixels.</p>
</td>
</tr>
<tr id="1024">
<td>
<pre>1024x1024</pre>
</td>
<td>
<p>Returns the image at a maximum size of 1024 by 1024 pixels.</p>
</td>
</tr>
<tr id="2048">
<td>
<pre>2048x2048</pre>
</td>
<td>
<p>Returns the image at a maximum size of 2048 by 2048 pixels.</p>
</td>
</tr>
<tr id="master">
<td>
<pre>master</pre>
</td>
<td>
<p>Returns the largest possible image (the current maximum image size is 2048 x 2048 pixels).</p>
</td>
</tr>
</tbody>
</table>
{% anchor_link "collection_img_url", "collection_img_url" %}
<p>Returns the collection image's URL. Accepts the same <a href="/themes/liquid-documentation/filters/url-filters/#size-parameters">size parameters</a> as <a href="/themes/liquid-documentation/filters/url-filters/#product_img_url">product_img_url</a>.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ collection.image | collection_img_url: 'medium' }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/collections/collection-image_medium.png?v=1337103726{% endraw %}{% endhighlight %}
</div>
{% anchor_link "shopify_asset_url", "shopify_asset_url" %}
Returns the URL of a global assets that are found on Shopify's servers. Globally-hosted assets include:
- option_selection.js
- api.jquery.js
- shopify_common.js,
- customer_area.js
- currencies.js
- customer.css
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ 'option_selection.js' | shopify_asset_url | script_tag }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<script src="//cdn.shopify.com/s/shopify/option_selection.js?20cf2ffc74856c1f49a46f6e0abc4acf6ae5bb34" type="text/javascript"></script>
{% endraw %}{% endhighlight %}
</div>
{% comment %}
{% anchor_link "theme_url", "theme_url" %}
<p>Generates the theme URL.</p>
<div>
{% highlight html %}{% raw %}
{{ theme_role | theme_url }}
{% endraw %}{% endhighlight %}
</div>
This filter outputs a URL that switches the active theme to the given role ("main" or "mobile"). This is the same URL used in the link generated by [link_to_theme](/themes/filters/5-link-to-theme).
See also: [themes](/themes/liquid-variables/themes), [theme](/themes/liquid-variables/theme).
{% endcomment %}
{% comment %}
{% anchor_link "url_for_product", "url_for_product" %}
<p>Generates a URL for a product name by transforming it to a <a href="/themes/liquid-documentation/basics/handle/">handle</a>. <code>url_for_product</code> does not output the actual handle of the product, which could have been edited to something else.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "Red sportscar" | url_for_product }}
{% endraw %}{% endhighlight %}
</div>
{% endcomment %}
{% anchor_link "url_for_type", "url_for_type" %}
Creates a URL that links to a collection page containing products with a specific product type.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "T-shirt" | url_for_type }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/collections/types?q=T-shirt
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "url_for_vendor", "url_for_vendor" %}
Creates a URL that links to a collection page containing products with a specific product vendor.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ "Shopify" | url_for_vendor }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/collections/vendors?q=Shopify
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "within", "within" %}
Creates a <i>collection-aware</i> product URL by prepending "/collections/collection-handle/" to a product URL, where "collection-handle" is the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of the collection that is currently being viewed.
<p class="input">Input</p>
{% highlight html %}{% raw %}
<a href="{{ product.url | within: collection }}">{{ product.title }}</a>
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/frontpage/products/alien-poster">Alien Poster</a>
{% endraw %}{% endhighlight %}
</div>
When a product is collection-aware, its product template can access the <a href="/themes/liquid-documentation/objects/collection/">collection</a> output of the collection that it belongs to. This allows you to add in collection-related content, such as <a href="http://docs.shopify.com/support/your-store/collections/how-to-navigate-within-a-collection">next/previous product links</a> or <a href="http://docs.shopify.com/support/your-store/products/can-i-recommend-related-products#finding-a-relevant-colleciton">related products</a>.

View File

@@ -1,6 +0,0 @@
---
layout: redirect
title: Liquid Reference
title-short: Liquid Reference
description: Liquid Reference
---

View File

@@ -1,217 +0,0 @@
---
layout: default
title: address
nav:
group: Liquid Variables
---
# address
The <code>address</code> object contains information entered by a customer in Shopify's checkout pages. Note that a customer can enter two addresses: **billing address** or **shipping address**.
{{ '/themes/address.jpg' | image }}
When accessing attributes of the <code>address</code> object, you must specify which address you want to target. This is done by using either <code>shipping_address</code> or <code>billing_address</code> before the attribute.
<code>address</code> can be used in email templates, the Thank You page of the checkout, as well as in apps such as Order Printer.
{% table_of_contents %}
{% anchor_link "address.name", "address-name" %}
Returns the values of the First Name **and** Last Name fields of the address.
<p class="input">Input</p>
{% highlight html %}{% raw %}
Hello, {{ billing_address.name }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hello, Bob Biller
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.first_name", "address-first_name" %}
Returns the value of the First Name field of the address.
{% anchor_link "address.last_name", "address-last_name" %}
Returns the value of the Last Name field of the address.
{% anchor_link "address.address1", "address-address1" %}
Returns the value of the Address1 field of the address.
{% anchor_link "address.address2", "address-address2" %}
Returns the value of the Address2 field of the address.
{% anchor_link "address.street", "address-street" %}
Returns the combined values of the Address1 and Address2 fields of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_address.street }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
126 York St, Shopify Office
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.company", "address-company" %}
Returns the value of the Company field of the address.
{% anchor_link "address.city", "address-city" %}
Returns the value of the City field of the address.
{% anchor_link "address.province", "address-province" %}
Returns the value of the Province/State field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ billing_address.province }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Ontario
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.province_code", "address-province_code" %}
Returns the abbreviated value of the Province/State field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ billing_address.province_code }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
ON
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.zip", "address-zip" %}
Returns the value of the Postal/Zip field of the address.
{% anchor_link "address.country", "address-country" %}
Returns the value of the Country field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_address.country }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Canada
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.country_code", "address-country_code" %}
Returns the value of the Country field of the address in ISO 3166-2 standard format.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_address.country_code }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
CA
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "address.phone", "address-phone" %}
Returns the value of the Phone field of the address.

View File

@@ -1,267 +0,0 @@
---
layout: default
title: article
nav:
group: Liquid Variables
---
# article
The <code>article</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "article.author", "article-author" %}
<p>Returns the full name of the article's author.</p>
{% anchor_link "article.comments", "article-comments" %}
Returns the published <a href="/themes/liquid-documentation/objects/comment/">comments</a> of an article. Returns an empty array if comments are disabled.
{% anchor_link "article.comments_count", "article-comments_count" %}
<p>Returns the number of published comments for an article.</p>
{% anchor_link "article.comments_enabled?", "article-comments_enabled?" %}
<p>Returns <code>true</code> if comments are enabled. Returns <code>false</code> if comments are disabled.</p>
{% anchor_link "article.comment_post_url", "article-comment_post_url" %}
<p>Returns the relative URL where POST requests are sent to when creating new comments.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ article.comment_post_url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/blogs/news/10582441-sale-starts-today/comments
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "article.content", "article-content" %}
<p>Returns the content of an article.</p>
{% anchor_link "article.created_at", "article-created_at" %}
<p>Returns the timestamp of when an article was created. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date filter</a> to format the timestamp.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ article.created_at | date: "%a, %b %d, %y" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Fri, Sep 16, 11
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "article.excerpt", "article-excerpt" %}
<p>Returns the excerpt of an article.</p>
{% anchor_link "article.excerpt_or_content", "article-excerpt_or_content" %}
<p>Returns <code>article.excerpt</code> of an article if it exists. Returns <code>article.content</code> if an excerpt does not exist for the article.</p>
{% anchor_link "article.id", "article.id" %}
<p>Returns the id of an article.</p>
{% anchor_link "article.moderated?", "article-moderated?" %}
<p>Returns <code>true</code> if the blog that the article belongs to is set to moderate comments. Returns <code>false</code> if the blog is not moderated.</p>
{% anchor_link "article.published_at", "article-published_at" %}
<p>Returns the date/time when an article was published. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date filter</a> to format the timestamp.</p>
{% anchor_link "article.tags", "article-tags" %}
<p>Returns all the tags for an article.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for tag in article.tags %}
{{tag}}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
tag1 tag2 tag3 tag4
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "article.title", "article-title" %}
<p>Returns the title of an article.</p>
{% anchor_link "article.url", "article-url" %}
<p>Returns the relative URL of the article.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ article.url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/blogs/news/10582441-my-new-article
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "article.user.account_owner", "article-user-account_owner" %}
<p>Returns "true" if the author of the article is the account owner of the shop. Returns "false" if the author is not the account owner.</p>
{% anchor_link "article.user.bio", "article-user-bio" %}
<p>Returns the bio of the author of an article. This is entered through the <strong>Staff members</strong> options on the <a href="http://www.shopify.com/admin/settings/account">Account</a> page.</p>
{% anchor_link "article.user.email", "article-user-email" %}
<p>Returns the email of the author of an article. This is entered through the <strong>Staff members</strong> options on the <a href="http://www.shopify.com/admin/settings/account">Account</a> page.</p>
{% anchor_link "article.user.first_name", "article-user-first_name" %}
<p>Returns the first name of the author of an article. This is entered through the <strong>Staff members</strong> options on the <a href="http://www.shopify.com/admin/settings/account">Account</a> page.</p>
{% anchor_link "article.user.last_name", "article-user-last_name" %}
<p>Returns the last name of the author of an article. This is entered through the <strong>Staff members</strong> options on the <a href="http://www.shopify.com/admin/settings/account">Account</a> page.</p>
{% anchor_link "article.user.homepage", "article-user-homepage" %}
<p>Returns the homepage of the author of an article. This is entered through the <strong>Staff members</strong> options on the <a href="http://www.shopify.com/admin/settings/account">Account</a> page.</p>

View File

@@ -1,152 +0,0 @@
---
layout: default
title: blog
nav:
group: Liquid Variables
---
# blog
The <code>blog</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "blog.all_tags", "blog-all_tags" %}
Returns all tags of all articles of a blog. This includes tags of articles that are not in the current pagination view.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for tag in blog.all_tags %}
{{ tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
News, Music, Sale, Tips and Tricks
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "blog.articles", "blog-articles" %}
Returns an array of all articles in a blog. See <a href="/themes/liquid-documentation/objects/article/">this page</a> for a list of all available attributes for <code>article</code>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for article in blog.articles %}
<h2>{{ article.title }}</h2>
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<h2>Hello World!</h2>
<h2>This is my second post.</h2>
<h2>Third time's a charm!</h2>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "blog.articles_count", "blog-articles_count" %}
Returns the total number of articles in a blog. This total does not include hidden articles.
{% anchor_link "blog.comments_enabled?", "blog-comments_enabled?" %}
Returns <code>true</code> if comments are enabled, or <code>false</code> if they are disabled.
{% anchor_link "blog.handle", "blog-handle" %}
Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of the blog.
{% anchor_link "blog.id", "blog-id" %}
Returns the id of the blog.
{% anchor_link "blog.moderated?", "blog-moderated?" %}
Returns <code>true</code> if comments are moderated, or <code>false</code> if they are not moderated.
{% anchor_link "blog.next_article", "blog-next_article" %}
Returns the URL of the next (older) post. Returns "false" if there is no next article.
{% anchor_link "blog.previous_article", "blog-previous_article" %}
Returns the URL of the previous (newer) post. Returns <code>false</code> if there is no next article.
{% anchor_link "blog.tags", "blog-tags" %}
Returns all tags in a blog. Similar to <a href="#blog.all_tags">all_tags</a>, but only returns tags of articles that are in the filtered view.
{% anchor_link "blog.title", "blog-title" %}
Returns the title of the blog.
{% anchor_link "blog.url", "blog-url" %}
Returns the relative URL of the blog.

View File

@@ -1,147 +0,0 @@
---
layout: default
title: cart
nav:
group: Liquid Variables
---
# cart
The <code>cart</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "cart.attributes", "cart-attributes" %}
<code>cart.attributes</code> allow the capturing of more information on the cart page. This is done by giving an input a <code>name</code>attribute with the following syntax:
<div>
{% highlight html %}{% raw %}
attributes[attribute-name]
{% endraw %}{% endhighlight %}
</div>
Shown below is a basic example of how to use an HTML input of type "text" to capture information on the cart page.
<div>
{% highlight html %}{% raw %}
<label>What is your Pet's name?</label>
<input type="text" name="attributes[your-pet-name]" value="{{ cart.attributes.your-pet-name }}" />
{% endraw %}{% endhighlight %}
</div>
<code>cart.attributes</code> can be accessed in order email templates, the Thank You page of the checkout, as well as in apps such as <a href="http://docs.shopify.com/manual/more/official-shopify-apps/order-printer">Order Printer</a>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ attributes.your-pet-name }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Haku
{% endraw %}{% endhighlight %}
</div>
For more examples on how to use cart attributes, see <a href="http://docs.shopify.com/manual/configuration/store-customization/communicating-with-customers/obtain-information/ask-customer-for-more-information#cart-attributes">Ask a customer for additional information</a>.
{% anchor_link "cart.item_count", "cart-item_count" %}
<p>Returns the number of items inside the cart.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ cart.item_count }} {{ cart.item_count | pluralize: 'Item', 'Items' }} ({{ cart.total_price | money }})
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
25 Items ($53.00)
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "cart.items", "cart-items" %}
<p>Returns all of the <a href="/themes/liquid-documentation/objects/line_item/">line items</a> in the cart.</p>
{% anchor_link "cart.note", "cart-note" %}
<code>cart.note</code> allows the capturing of more information on the cart page.
This is done by submitting the cart form with an HTML <code>textarea</code> and wrapping the <code>cart.note</code> output.
<div>
{% highlight html %}{% raw %}
<label>Gift note:</label>
<textarea rows="100" cols="20">{{ cart.note }}</textarea>
{% endraw %}{% endhighlight %}
</div>
{% block "note" %}
There can only be one instance of <code>{% raw %}{{ cart.note }}{% endraw %}</code> on the cart page. If there are multiple instances, the one that comes latest in the Document Object Model (DOM) will be submitted with the form.
{% endblock %}
<code>cart.note</code> can be accessed in order email templates, the Thank You page of the checkout, as well as in apps such as <a href="http://docs.shopify.com/manual/more/official-shopify-apps/order-printer">Order Printer</a>. For examples on how to use cart notes, see <a href="http://docs.shopify.com/manual/configuration/store-customization/communicating-with-customers/obtain-information/ask-customer-for-more-information#cart-note">Ask a customer for additional information</a>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ note }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hope you like the gift, Kylea!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "cart.total_price", "cart-total_price" %}
<p>Returns the total price of all of the items in the cart.</p>
{% anchor_link "cart.total_weight", "cart-total_weight" %}
<p>Returns the total weight of all of the items in the cart.</p>

View File

@@ -1,455 +0,0 @@
---
layout: default
title: collection
nav:
group: Liquid Variables
---
# collection
The <code>collection</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% comment %}
Commenting out all_products and all_products_count as I don't see a purpose for them atm. The pagination limit for products and all_products is the same, so what is the difference?
{% anchor_link "collection.all_products", "collection.all_products" %}
Returns all of the products inside a collection. Note that there is a limit of 50 products that can be shown per page. Use the <a href="#">pagination</a> tag to control how many products are shown per page.
{% anchor_link "collection.all_products_count", "collection.all_products_count" %}
<p>Returns the number of products in a collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ collection.all_products_count }} {{ collection.all_products_count | pluralize: 'Item', 'Items' }} total
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
24 Items
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.all_tags", "collection.all_tags" %}
Returns all tags of all products of a collection. This includes tags of products that are not in the current pagination view.
{% highlight html %}{% raw %}
{% if collection.all_tags.size > 0 %}
{% for tag in collection.all_tags %}
{% if current_tags contains tag %}
<li class="active">
{{ tag | link_to_remove_tag: tag }}
</li>
{% else %}
<li>
{{ tag | link_to_tag: tag }}
</li>
{% endif %}
{% endfor %}
{% endif %}
{% endraw %}{% endhighlight %}
# {% endcomment %}
{% anchor_link "collection.all_types", "collection-all_types" %}
<p>Returns a list of all product types in a collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% for product_type in collection.all_types %}
{{ product_type | link_to_type }}
{% endfor %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/types?q=Accessories" title="accessories">Accessories</a>
<a href="/collections/types?q=Chairs" title="Chairs">Chairs</a>
<a href="/collections/types?q=Shoes" title="Shoes">Shoes</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.all_vendors", "collection-all_vendors" %}
<p>Returns a list of all product vendors in a collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% for product_vendor in collection.all_vendors %}
{{ product_vendor | link_to_vendor }}
{% endfor %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/vendors?q=Shopify" title="Shopify">Shopify</a>
<a href="/collections/vendors?q=Shirt+Company" title="Shirt Company">Shirt Company</a>
<a href="/collections/vendors?q=Montezuma" title="Montezuma">Montezuma</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.current_type", "collection-current_type" %}
Returns the product type when filtering a collection by type. For example, you may be on a collection page filtered by a type query parameter via this URL: <tt>myshop.shopify.com/collections?types=shirts</tt>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% if collection.current_type %}
{{ collection.current_type }}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
shirts
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.current_vendor", "collection-current_vendor" %}
Returns the vendor name when filtering a collection by vendor. For example, you may be on a collection page filtered by a vendor query parameter via this URL: <tt>myshop.shopify.com/collections/vendors?q=Shopify</tt>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% if collection.current_vendor %}
{{ collection.current_vendor }}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Shopify
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.default_sort_by", "collection-default_sort_by" %}
<p>Returns the sort order of the collection, which is set in the collection pages of the Admin.</p>
{{ '/themes/collection-sorting.jpg' | image }}
The possible outputs are:
- manual
- best-selling
- title-ascending
- title-descending
- price-ascending
- price-descending
- created-ascending
- created-descending
{% anchor_link "collection.description", "collection-description" %}
<p>Returns the description of the collection.</p>
{% anchor_link "collection.handle", "collection-handle" %}
<p>Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of a collection. </p>
{% anchor_link "collection.id", "collection-id" %}
<p>Returns the id of the collection.</p>
{% anchor_link "collection.image", "collection-image" %}
<p>Returns the collection image. Use the <a href="/themes/liquid-documentation/filters/url-filters/#collection_img_url">collection_img_url</a> filter to link it to the image file on the Shopify CDN.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ collection.image | collection_img_url: 'medium' }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/collections/collection-image_medium.png?v=1337103726
{% endraw %}{% endhighlight %}
</div>
{% comment %}
Commenting out since you can't actually change alt tag in admin.
{% anchor_link "collection.image.alt", "collection.image.alt" %}
<p>Returns the collection image's alt tag.</p>
{% endcomment %}
{% anchor_link "collection.image.src", "collection-image-src" %}
<p>Returns the relative URL to the collection image.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ collection.image.src | collection_img_url: 'medium' }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/collections/summer_collection_medium.png?v=1334084726
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.next_product", "collection-next_product" %}
Returns the URL of the next product in the collection. Returns <code>nil</code> if there is no next product.
This output can be used on the product page to output "next" and "previous" links on the <tt>product.liquid</tt> template. For more information, see <a href="http://docs.shopify.com/support/your-store/collections/how-to-navigate-within-a-collection">How to Navigate within a Collection</a>.
{% anchor_link "collection.previous_product", "collection-previous_product" %}
Returns the URL of the previous product in the collection. Returns <code>nil</code> if there is no previous product.
This output can be used on the product page to output "next" and "previous" links on the <tt>product.liquid</tt> template. For more information, see <a href="http://docs.shopify.com/support/your-store/collections/how-to-navigate-within-a-collection">How to Navigate within a Collection</a>.
{% anchor_link "collection.products", "collection-products" %}
Returns all of the products inside a collection. Note that there is a limit of 50 products that can be shown per page. Use the <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">pagination</a> tag to control how many products are shown per page.
{% anchor_link "collection.products_count", "collection-products_count" %}
<p>Returns the number of products in a collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ collection.all_products_count }} {{ collection.all_products_count | pluralize: 'Item', 'Items' }} total
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
24 Items
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.template_suffix", "collection-template_suffix" %}
<p>Returns the name of the custom collection template assigned to the collection, without the <tt>collection.</tt> prefix or the <tt>.liquid</tt> suffix. Returns <code>nil</code> if a custom template is not assigned to the collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ collection.template_suffix }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
no-price
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.title", "collection-title" %}
<p>Returns the title of the collection.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
<h1>{{ collection.title }}</h1>
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Frontpage
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "collection.tags", "collection-tags" %}
<p>Returns all tags of all products in a collection.</p>
{% anchor_link "collection.url", "collection-url" %}
<p>Returns the URL of the collection.</p>

View File

@@ -1,71 +0,0 @@
---
layout: default
title: comment
nav:
group: Liquid Variables
---
# comment
The <code>comment</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "comment.id", "comment-id" %}
Returns the id (unique identifier) of the comment.
{% anchor_link "comment.author", "comment-author" %}
Returns the author of the comment.
{% anchor_link "comment.email", "comment-email" %}
Returns the e-mail address of the comment's author.
{% anchor_link "comment.content", "comment-content" %}
Returns the content of the comment.
{% anchor_link "comment.status", "comment-status" %}
Returns the status of the comment. The possible values are:
- unapproved
- published
- removed
- spam
{% anchor_link "comment.url", "comment-url" %}
Returns the URL of the article with <code>comment.id</code> appended to it. This is so the page will automatically scroll to the comment.

View File

@@ -1,37 +0,0 @@
---
layout: default
title: country_option_tags
nav:
group: Liquid Variables
---
# country_option_tags
<code>country_option_tags</code> creates an &#60;option&#62; tag for each country. An attribute named <code>data-provinces</code> is set for each country, containing JSON-encoded arrays of the country's respective subregions. If a country does not have any subregions, an empty array is set for its <code>data-provinces</code> attribute.
<code>country_option_tags</code> must be wrapped in &#60;select&#62; HTML tags.
<p class="input">Input</p>
{% highlight html %}{% raw %}
<select name="country">
{{ country_option_tags }}
</select>
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}
<select name="country">
<option value"" data-provinces="[]">- Please Select --</option>
...
...
<option value="Canada" data-provinces="["Alberta","British Columbia","Manitoba","New Brunswick","Newfoundland","Northwest Territories","Nova Scotia","Nunavut","Ontario","Prince Edward Island","Quebec","Saskatchewan","Yukon"]">Canada</option>
<option value="China" data-provinces="[]">China</option>
...
...
</select>
{% endhighlight %}

View File

@@ -1,26 +0,0 @@
---
layout: default
title: current_page
nav:
group: Liquid Variables
---
# current_page
<code>current_page</code> returns the number of the page you are on when browsing through <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">paginated</a> content. It can be used outside the <code>paginate</code> block.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ page_title }} - Page: {{ current_page }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Summer Collection - Page: 1
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,64 +0,0 @@
---
layout: default
title: current_tags
nav:
group: Liquid Variables
---
# current_tags
Product tags are used to filter a collection to only show products that contain a specific product tag. Similarly, article tags are used to filter a blog to only show products that contain a specific article tag. The <code>current_tags</code> variable is an array that contains all tags that are being used to filter a collection or blog.
{% block "note-information" %}
Tags inside the current_tags array will always display in alphabetical order. It is not possible to manually change the order.
{% endblock %}
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "Inside collection.liquid", "collection" %}
Inside collection.liquid, <code>current_tags</code> contains all <strong>product tags</strong> that are used to filter a collection.
The example below creates a list that displays every tag within every product in a collection. If the collection is filtered by the tag (i.e. if <code>current_tags</code> **does** contain the tag), the link will remove the filter. If the collection is not currently filtered by the tag (if <code>current_tags</code> **does not** contain the tag), a link will appear to allow the user to do so.
{% highlight html %}{% raw %}
<ul>
{% for tag in collection.all_tags %}
{% if current_tags contains tag %}
<li class="active">{{ tag | link_to_remove_tag: tag }}</li>
{% else %}
<li>{{ tag | link_to_add_tag: tag }}</li>
{% endif %}
{% endfor %}
</ul>
{% endraw %}{% endhighlight %}
{% anchor_link "Inside blog.liquid", "blog" %}
Inside blog.liquid, <code>current_tags</code> contains all <strong>article</strong> tags that are used to filter the blog.
The example below adds a breadcrumb that shows which article tag is being used to filter a blog. If there is a tag being used to filter a blog, the breadcrumb displays the tag name and provides a link back to the unfiltered blog.
{% highlight html %}{% raw %}
{% if current_tags %}
<h1>{{ blog.title | link_to: blog.url }} &raquo; {{ current_tags.first }}</h1>
{% else %}
<h1>{{ blog.title }}</h1>
{% endif %}
{% endraw %}{% endhighlight %}

View File

@@ -1,238 +0,0 @@
---
layout: default
title: customer_address
nav:
group: Liquid Variables
---
# customer_address
The <code>customer_address</code> contains information of addresses tied to a <a href="http://docs.shopify.com/manual/your-store/customers/customer-accounts">Customer Account</a>.
{% table_of_contents %}
{% anchor_link "customer_address.first_name", "first-name" %}
Returns the value of the First Name field of the address.
{% anchor_link "customer_address.last_name", "last-name" %}
Returns the value of the Last Name field of the address.
{% anchor_link "customer_address.address1", "customer_address-address1" %}
Returns the value of the Address1 field of the address.
{% anchor_link "customer_address.address2", "customer_address-address2" %}
Returns the value of the Address2 field of the address.
{% anchor_link "customer_address.street", "street" %}
Returns the combined values of the Address1 and Address2 fields of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_address.street }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
126 York St, Shopify Office
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_address.company", "company" %}
Returns the value of the Company field of the address.
{% anchor_link "customer_address.city", "city" %}
Returns the value of the City field of the address.
{% anchor_link "customer_address.province", "province" %}
Returns the value of the Province/State field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ customer_address.province }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Ontario
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_address.province_code", "province_code" %}
Returns the abbreviated value of the Province/State field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ billing_address.province_code }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
ON
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_address.zip", "zip" %}
Returns the value of the Postal/Zip field of the address.
{% anchor_link "customer_address.country", "country" %}
Returns the value of the Country field of the address.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ customer_address.country }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Japan
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_address.country_code", "country-code" %}
Returns the value of the Country field of the address in ISO 3166-2 standard format.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ customer_address.country_code }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
CA
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer_address.phone", "phone" %}
Returns the value of the Phone field of the address.
{% anchor_link "customer_address.id", "id" %}
Returns the id of customer address.

View File

@@ -1,273 +0,0 @@
---
layout: default
title: customer
nav:
group: Liquid Variables
---
# customers
<p>The <code>customer</code> object contains information of customers who have created a <a href="http://docs.shopify.com/manual/your-store/customers/customer-accounts">Customer Account</a>.</p>
<p><code>customer</code> can also be accessed in order email templates, the Thank You page of the checkout, as well as in apps such as <a href="http://docs.shopify.com/manual/more/official-shopify-apps/order-printer">Order Printer</a>.</p>
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "customer.accepts_marketing", "customer-accepts_marketing" %}
<p>Returns <code>true</code> if the customer accepts marketing, returns <code>false</code> if the customer does not.</p>
{% anchor_link "customer.addresses", "customer-addresses" %}
Returns an array of all of the customer addresses associated with a customer. See <a href="/themes/liquid-documentation/objects/customer-address/">customer_address</a> for a full list of available attributes.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for address in customer.addresses %}
{{ address.street }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
126 York St, Suite 200 (Shopify Office)
123 Fake St
53 Featherston Lane
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer.addresses_count", "customer-addresses_count" %}
<p>Returns the number of addresses associated with a customer.</p>
{% anchor_link "customer.default_address", "customer-default_address" %}
<p>Returns the default <a href="/themes/liquid-documentation/objects/customer-address/">customer_address</a> of a customer.</p>
{% anchor_link "customer.email", "customer-email" %}
<p>Returns the email address of the customer.</p>
{% anchor_link "customer.first_name", "customer-first_name" %}
<p>Returns the first name of the customer.</p>
{% anchor_link "customer.id", "customer-id" %}
<p>Returns the id of the customer.</p>
{% anchor_link "customer.last_name", "customer-last_name" %}
<p>Returns the last name of the customer.</p>
{% anchor_link "customer.last_order", "customer-last_order" %}
<p>Returns the last <a href="/themes/liquid-documentation/objects/order/">order </a> placed by the customer. </p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Your last order was placed on: {{ customer.last_order.created_at | date: "%B %d, %Y %I:%M%p" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Your last order was placed on: April 25, 2014 01:49PM
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer.name", "customer-name" %}
<p>Returns the full name of the customer.</p>
{% anchor_link "customer.orders", "customer-orders" %}
<p>Returns an array of all <a href="/themes/liquid-documentation/objects/order/">orders</a> placed by the customer.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for order in customer.orders %}
{{ order.id }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
#1088
#1089
#1090
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer.orders_count", "customer-orders_count" %}
<p>Returns the total number of orders a customer has placed.</p>
{% anchor_link "customer.recent_order", "customer-recent_order" %}
<p>Returns the most recent <a href="/themes/liquid-documentation/objects/order/">order </a> placed by the customer. </p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Your most recent order was placed on: {{ customer.recent_order.created_at | date: "%B %d, %Y %I:%M%p" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Your last order was placed on: August 25, 2014 05:49PM
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer.tags", "customer-tags" %}
Returns the list of tags associated with the customer.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for tag in customer.tags %}
{{ tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
wholesale regular-customer VIP
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "customer.total_spent", "customer-total_spent" %}
<p>Returns the total amount spent on all orders.</p>

View File

@@ -1,111 +0,0 @@
---
layout: default
title: discount
nav:
group: Liquid Variables
---
# discount
The <code>discount</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "discount.id", "discount.id" %}
Returns the id of the discount.
{% anchor_link "discount.code", "discount-code" %}
Returns the code of the discount.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ discount.code }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
SPRING14
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "discount.amount", "discount-amount" %}
Returns the amount of the discount. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ discount.amount | money }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
$25
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "discount.savings", "discount-savings" %}
Returns the amount of the discount's savings. The negative opposite of <a href="#discount.amount">amount</a>. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ discount.savings | money }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
$-25
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "discount.type", "discount-type" %}
Returns the type of the discount. The possible values of <code>discount.type</code> are:
- FixedAmountDiscount
- PercentageDiscount
- ShippingDiscount

View File

@@ -1,252 +0,0 @@
---
layout: default
title: forloop
nav:
group: Liquid Variables
---
# forloop
The <code>forloop</code> object contains attributes of its parent <a href="/themes/liquid-documentation/tags/iteration-tags/#for">for</a> loop.
{% block "note-information" %}
The <code>forloop</code> object can only be used within <a href="/themes/liquid-documentation/tags/iteration-tags/#for">for</a> tags.
{% endblock %}
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "forloop.first", "first" %}
Returns <code>true</code> if it's the first iteration of the for loop. Returns <code>false</code> if it is not the first iteration.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{% if forloop.first == true %}
First time through!
{% else %}
Not the first time.
{% endif %}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
First time through!
Not the first time.
Not the first time.
Not the first time.
Not the first time.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.index", "index" %}
Returns the current index of the for loop, starting at 1.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{{ forloop.index }}
{% endfor %}{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.index0", "index0" %}
Returns the current index of the for loop, starting at 0.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{{ forloop.index }}
{% endfor %}{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.last", "last" %}
Returns <code>true</code> if it's the last iteration of the for loop. Returns <code>false</code> if it is not the last iteration.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{% if forloop.last == true %}
This is the last iteration!
{% else %}
Keep going...
{% endif %}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Keep going...
Keep going...
Keep going...
Keep going...
Keep going...
This is the last iteration!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.rindex", "rindex" %}
Returns <a href="#index">forloop.index</a> in reverse order.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{{ forloop.rindex }}
{% endfor %}{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.rindex0", "rindex0" %}
Returns <a href="#index0">forloop.index0</a> in reverse order.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{{ forloop.rindex0 }}
{% endfor %}{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "forloop.length", "length" %}
<p>Returns the number of iterations of the for loop.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if collections.frontpage.products contains 10 products -->
{% for product in collections.frontpage.products %}
{% capture length %}{{ forloop.length }}{% endcapture %}
{% endfor %}
{{ length }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
10
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,128 +0,0 @@
---
layout: default
title: form
nav:
group: Liquid Variables
---
# form
The <code>form</code> object is used within the <a href="/themes/liquid-documentation/tags/theme-tags/#form">form</a> tag. It contains attributes of its parent form.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "form.author", "form-author" %}
<p>Returns the name of the author of the blog article comment. Exclusive to <code>form</code> tags with the "article" parameter.</p>
{% anchor_link "form.body", "form-body" %}
<p>Returns the content of the blog article comment. Exclusive to <code>form</code> tags with the "article" parameter.</p>
{% anchor_link "form.email", "form-email" %}
<p>Returns the email of the blog article comment's author. Exclusive to <code>form</code> tags with the "article" parameter.</p>
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "form.errors", "form-errors" %}
Returns an array of strings if the form was not submitted successfully. The strings returned depend on which fields of the form were left empty or contained errors. Possible values are:
- author
- body
- email
- form
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for error in form.errors %}
{{ error }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- if the Name field was left empty by the user -->
author
{% endraw %}{% endhighlight %}
</div>
You can apply the <a href="/themes/liquid-documentation/filters/additional-filters/#default_errors">default_errors</a> filter on <code>form.errors</code> to output default error messages without having to loop through the array.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% if form.errors %}
{{ form.errors | default_errors }}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Please enter a valid email address.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "form.posted_successfully?", "form-posted_successfully" %}
<p>Returns <code>true</code> if a comment by the user was submitted successfully, or <code>false</code> if the form contained errors.</p>
<div>
{% highlight html %}{% raw %}
{% if form.posted_successfully? %}
Comment posted successfully!
{% else %}
{{ form.errors | default_errors }}
{% endif %}
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,93 +0,0 @@
---
layout: default
title: fulfillment
nav:
group: Liquid Variables
---
# fulfillment
The <code>fulfillment</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% comment %} Commenting out as this doesn't actually work.
{% anchor_link "fulfillment.created_at", "fulfillment.created_at" %}
<p>Returns the date the fulfillment was created at.</p>
<div>
{% highlight html %}{% raw %}
Fulfilled {{ line_item.fulfillment.created_at | date: "%b %d" }}
{% endraw %}{% endhighlight %}
</div>
{% endcomment %}
{% anchor_link "fulfillment.tracking_company", "fulfillment-tracking_company" %}
<p>Returns the name of the fulfillment service.</p>
{% anchor_link "fulfillment.tracking_number", "fulfillment-tracking_number" %}
<p>Returns the tracking number for a fulfillment if it exists.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Tracking Number: {{ line_item.fulfillment.tracking_number }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Tracking Number: 1Z5F44813600X02768
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "fulfillment.tracking_url", "fulfillment-tracking_url" %}
<p>Returns the URL for a tracking number.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ fulfillment.tracking_url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber1=1Z5F44813600X02768&TypeOfInquiryNumber=T&AcceptUPSLicenseAgreement=yes&submit=Track
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,162 +0,0 @@
---
layout: default
title: gift_card
nav:
group: Liquid Variables
---
# gift_card
The <code>gift_card</code> object can be accessed in the following templates:
1. The Gift Card Notification email notification template [Email Notifications > Gift Card Notification](http://shopify.com/admin/settings/notifications)
2. The [**gift_card.liquid**](/themes/theme-development/templates/gift-cards-liquid/) template.
The <code>gift_card</code> variable has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "gift_card.balance", "gift_card-balance" %}
<p>Returns the amount of money remaining on the gift card.</p>
{% anchor_link "gift_card.code", "gift_card-code" %}
<p>Returns the code that was used to redeem the gift card.</p>
{% anchor_link "gift_card.currency", "gift_card-currency" %}
<p>Returns the currency that the card was issued in.</p>
{% anchor_link "gift_card.customer", "gift_card-customer" %}
Returns the <a href="/themes/liquid-documentation/objects/customer/">customer</a> variable of the customer that the gift card is assigned to.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Hey, {{ gift_card.customer.first_name }}!
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hey, John!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "gift_card.enabled", "gift_card-enabled" %}
<p>Returns <code>true</code> if the card is enabled, or <code>false</code> if the card is disabled.</p>
{% anchor_link "gift_card.expired", "gift_card-expired" %}
<p>Returns <code>true</code> if the card is expired, or <code>false</code> if the card is not.</p>
{% anchor_link "gift_card.expires_on", "gift_card-expires_on" %}
<p>Returns the expiration date of the gift card</p>
{% anchor_link "gift_card.initial_value", "gift_card-initial_value" %}
<p>Returns the initial amount of money on the gift card.</p>
{% anchor_link "gift_card.properties", "gift_card-properties" %}
<p>Returns the <a href="http://docs.shopify.com/support/your-store/products/how-do-I-collect-additional-information-on-the-product-page-Like-for-a-monogram-engraving-or-customization">line item properties</a> assigned to the gift card when it was added to the cart.</p>
{% anchor_link "gift_card.url", "gift_card-url" %}
<p>Returns the unique URL that links to the gift card's page on the shop (rendered through <strong>gift_card.liquid</strong>).</p>

View File

@@ -1,112 +0,0 @@
---
layout: default
title: image
nav:
group: Liquid Variables
---
# image
The <code>image</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "image.alt", "image-alt" %}
<p>Returns the alt tag of the image, set in the <a href="http://docs.shopify.com/support/your-store/products/can-i-add-alt-text-to-my-product-images">Products</a> page of the Admin.</p>
{% anchor_link "image.id", "image-id" %}
Returns the id of the image.
{% anchor_link "image.product_id", "image-product_id" %}
Returns the id of the image's product.
{% anchor_link "image.position", "image-position" %}
Returns the position of the image, starting at 1. This is the same as outputting <a href="/themes/liquid-documentation/objects/for-loops/#index">forloop.index</a>.
{% anchor_link "image.src", "image-src" %}
Returns the relative path of the product image. This is the same as outputting <code>&#123;&#123; image &#125;&#125;</code>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for image in product.images %}
{{ image.src }}
{{ image }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
products/my_image.jpg
products/my_image.jpg
{% endraw %}{% endhighlight %}
</div>
To return the URL of the image on Shopify's Content Delivery Network (CDN), use the appropriate <a href="/themes/liquid-documentation/filters/url-filters">URL filter</a>.
To see a full list of available image sizes, see <a href="/themes/liquid-documentation/filters/url-filters/#size-parameters">image size parameters</a>.
Shown below is an example of loading a product image using the <code>product_img_url</code> filter.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ image | product_img_url: "medium" }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
//cdn.shopify.com/s/files/1/0087/0462/products/shirt14_medium.jpeg?v=1309278311
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,235 +0,0 @@
---
layout: default
title: Objects
landing_as_article: true
nav:
group: Liquid Documentation
weight: 2
---
# Objects
Liquid objects contain attributes to output dynamic content on the page. For example, the <code>product</code> object contains an attribute called <code>title</code> that can be used to output the title of a product.
**Liquid objects** are also often refered to as **Liquid variables**.
To output an object's attribute on the page, wrap them in <code>&#123;&#123;</code> and <code>&#125;&#125;</code>, as shown below:
{% highlight html %}{% raw %}
{{ product.title }} <!-- Output: “Awesome Shoes” -->
{% endraw %}{% endhighlight %}
<h2 id='global-objects'>Global Objects</h2>
The following objects can be used and accessed from **any file** in your theme, and are defined as **global objects**, or global variables:
<table>
<tbody>
<tr>
<td><pre>blogs</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
<ul>
{% for article in blogs.myblog.articles %}
<li>{{ article.title | link_to: article.url }}</li>
{% endfor %}
</ul>
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>blogs</code> refers to the blogs in your shop. <a href="/themes/liquid-documentation/objects/blog">More info &rsaquo;</a>
</td>
</tr>
<tr>
<td><pre>cart</pre></td>
<td>
<div></div>
<p>The liquid object <code>cart</code> refers to the cart in your shop. <a href="/themes/liquid-documentation/objects/cart">More info &rsaquo;</a>
</td>
</tr>
<tr>
<td><pre>collections</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% for product in collections.frontpage.products %}
{{ product.title }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>collections</code> contains a list of all of the collections in a shop. <a href="/themes/liquid-documentation/objects/collection">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>current_page</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% if current_page != 1 %} Page {{ current_page }}{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>The <code>current_page</code> object returns the number of the page you are on when browsing through paginated content. <a href="/themes/liquid-documentation/objects/current-page">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>current_tags</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
<!-- in blog.liquid -->
{% if current_tags %}
<h1>{{ blog.title | link_to: blog.url }} &rsaquo; {{ current_tags.first }}</h1>
{% else %}
<h1>{{ blog.title }}</h1>
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>The <code>current_tags</code> object will contain a different list of tags depending on the type of template that is rendered. <a href="/themes/liquid-documentation/objects/current-tags">More info &rsaquo;</a>
</td>
</tr>
<tr>
<td><pre>customer</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% if shop.customer_accounts_enabled %}
{% if customer %}
<a href="/account">My Account</a>
{{ 'Log out' | customer_logout_link }}
{% else %}
{{ 'Log in' | customer_login_link }}
{% if shop.customer_accounts_optional %}
{{ 'Create an account' | customer_register_link }}
{% endif %}
{% endif %}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>customer</code> is only defined when a customer is logged-in to the store. <a href="/themes/liquid-documentation/objects/customer">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>linklists</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
<ul>
{% for link in linklists.categories.links %}
<li>{{ link.title | link_to: link.url }}</li>
{% endfor %}
</ul>
{% endraw %}{% endhighlight%}
</div>
<p>The liquid object <code>linklists</code> contains a collection of all of the links in your shop. You can access a linklist by calling its handle on linklists. <a href="/themes/liquid-documentation/objects/linklist">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>pages</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
<h1>{{ pages.about.title }}</h1>
<p>{{ pages.about.author }} says...</p>
<div>{{ pages.about.content }}</div>
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>pages</code> refers to all of the pages in your shop. <a href="/themes/liquid-documentation/objects/page">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>page_description</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% if page_description %}
<meta name="description" content="{{ page_description }}" />
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>Merchants can specify a <code>page_description</code>. That field is automatically populated with the product/collection/article description. <a href="/themes/liquid-documentation/objects/page-description">More info &rsaquo;</a>
</p>
</td>
</tr>
<tr>
<td><pre>page_title</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{{ page_title }}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>page_title</code> returns the title of the current page. <a href="/themes/liquid-documentation/objects/page-title">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>shop</pre></td>
<td>
<div>
</div>
<p>The liquid object <code>shop</code> returns information about your shop. <a href="/themes/liquid-documentation/objects/shop">More info &rsaquo;</a>
</td>
</tr>
<tr>
<td><pre>template</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% if template contains 'product' %}
WE ARE ON A PRODUCT PAGE.
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>template</code> returns the name of the template used to render the current page, with the .liquid extension omitted. As a best practice, it is recommended that you use the template object as a body class. <a href="/themes/liquid-documentation/objects/template">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>settings</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
{% if settings.use_logo %}
{{ 'logo.png' | asset_url | img_tag: shop.name }}
{% else %}
<span class="no-logo">{{ shop.name }}</span>
{% endif %}
{% if settings.featured_collection and settings.featured_collection != '' and collections[settings.featured_collection].handle == settings.featured_collection and collections[settings.featured_collection].products_count > 0 %}
{% for product in collections[settings.featured_collection].products %}
{% include 'product-loop' %}
{% endfor %}
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>settings</code> gives you access to all of the theme settings. <a href="/themes/theme-development/templates/settings#settings-object">More info &rsaquo;</a></p>
</td>
</tr>
<tr>
<td><pre>theme</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
Go to your <a href="/admin/themes/{{ theme.id }}/settings">theme settings</a>.
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>theme</code> represents the currently active theme. <a href="/themes/liquid-documentation/objects/theme">More info &rsaquo;</a></p></p>
</td>
</tr>
<tr>
<td><pre>themes</pre></td>
<td>
<div>
{% highlight html %}{% raw %}
We have a beautiful mobile theme, it's called {{ themes.mobile.name | link_to_theme: "mobile" }}
{% endraw %}{% endhighlight %}
</div>
<p>The liquid object <code>themes</code> provides access to the shop's published themes. <a href="/themes/liquid-documentation/objects/theme">More info &rsaquo;</a></p>
</td>
</tr>
</tbody>
</table>

View File

@@ -1,238 +0,0 @@
---
layout: default
title: line_item
nav:
group: Liquid Variables
---
# line_item
A <strong>line item</strong> represents a single line in the shopping cart. There is one line item for each distinct product variant in the cart.
The <code>line_item</code> object can be accessed in all Liquid templates, as well as in notification email templates, the Thank You page of the checkout, as well as in apps such as [Order Printer](http://docs.shopify.com/manual/more/official-shopify-apps/order-printer).
The <code>line_item</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "line_item.id", "line-id" %}
Returns the id of the line item, which is the same as the id of its [variant](/themes/liquid-documentation/objects/variant/).
{% anchor_link "line_item.product", "product" %}
Returns the [product](/themes/liquid-documentation/objects/product/) of the line item.
Example for getting a line item's image:
{% highlight html %}{% raw %}
{{ line_item.product.featured_image | product_img_url | img_tag }}
{% endraw %}{% endhighlight %}
{% anchor_link "line_item.variant", "variant" %}
Returns the [variant](/themes/liquid-documentation/objects/variant/) of the line item.
{% anchor_link "line_item.title", "title" %}
Returns the title of this line item. <code>line_item.title</code> combines both the line item's <code>product.title</code> and the line item's <code>variant.title</code>, separated by a hyphen.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ line_item.title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Balloon Shirt - Medium
{% endraw %}{% endhighlight %}
</div>
To output just the product title or variant title, you can access the <code>title</code> of the respective variables.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Product Title: {{ line_item.product.title }}
Variant Title: {{ line_item.variant.title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Product Title: Balloon Shirt
Variant Title: Medium
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "line_item.price", "price" %}
Returns the price of the line item's variant.
{% anchor_link "line_item.line_price", "line-price" %}
Returns the combined price of all the items in the line_item. This is the equivalent of <code>line_item.price</code> times <code>line_item.quantity</code>.
{% anchor_link "line_item.quantity", "quantity" %}
Returns the quantity of the line item.
{% anchor_link "line_item.grams", "grams" %}
Returns the weight of the line item. Use the [weight_with_unit](/themes/liquid-documentation/filters/additional-filters/#weight_with_unit) filter to format the weight.
{% anchor_link "line_item.sku", "sku" %}
Returns the SKU of the line item's variant.
{% anchor_link "line_item.vendor", "vendor" %}
Returns the vendor name of the line item's product.
{% anchor_link "line_item.requires_shipping", "requires-shipping" %}
Returns <code>true</code> if the line item requires shipping, or <code>false</code> if it does not. This is set in the variant options in the Products page of the Admin.
{% anchor_link "line_item.variant_id", "variant-id" %}
Returns the id of the line item's variant.
{% anchor_link "line_item.product_id", "product-id" %}
Returns the id of the line item's product.
{% anchor_link "line_item.fulfillment", "fulfillment" %}
Returns the [fulfillment](/themes/liquid-documentation/objects/fulfillment/) of the line item.

View File

@@ -1,107 +0,0 @@
---
layout: default
title: link
nav:
group: Liquid Variables
---
# link
The <code>link</code> object cannot be invoked on its own. It must be invoked inside a <a href="/themes/liquid-documentation/objects/linklist/">linklist</a>.
The <code>link</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "link.active", "link-active" %}
<p>Returns <code>true</code> if the link is active, or <code>false</code> if the link is inactive.</p>
<p>If you are on a product page that is <a href="/themes/liquid-documentation/filters/url-filters/#within">collection-aware</a>, <code>link.active</code>will return <code>true</code> for both the collection-aware product URL and the collection-agnostic URL. For example, if you have a link whose URL points to:</p>
<div>{% highlight html %}{% raw %}
/products/awesome-product
{% endraw %}{% endhighlight %}</div>
<p><code>link.active</code> will return <code>true</code> for the following URL, which links to the same product but through a collection:
<div>{% highlight html %}{% raw %}
/collections/awesome-collection/products/awesome-product
{% endraw %}{% endhighlight %}</div>
<p>If you are on a collection page filtered with tags, and the link points to the unfiltered collection page, <code>link.active</code> will return <code>true</code>.</p>
<p>If you are on an article page and your link points to the blog, <code> link.active</code> will return <code>true</code>.</p>
{% anchor_link "link.object", "link-object" %}
Returns the variable associated to the link. The type of variable that is returned is dependent on the value of <strong>Links To</strong> field of the link. The possible types are:
- <a href="/themes/liquid-documentation/objects/product/">product</a>
- <a href="/themes/liquid-documentation/objects/collection/">collection</a>
- <a href="/themes/liquid-documentation/objects/page/">page</a>
- <a href="/themes/liquid-documentation/objects/blog/">blog</a>
Through <code>link.object</code>, you can access any of the attributes that are available in the above three variables.
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
<!-- If the product links to a product with a price of $10 -->
{{ link.object.price | money }}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
$10
{% endraw %}{% endhighlight %}</div>
{% anchor_link "link.title", "link-title" %}
<p>Returns the title of the link.</p>
{% anchor_link "link.type", "link-type" %}
Returns the type of the link. The possible values are:
- <strong>collection_link</strong>: if the link points to a collection
- <strong>product_link</strong>: if the link points to a product page
- <strong>page_link</strong>: if the link points to a page
- <strong>blog_link</strong>: if the link points to a blog
- <strong>relative_link</strong>: if the link points to the search page, the home page or /collections/all
- <strong>http_link</strong>: if the link points to an external web page, or a type or vendor collection (ex: /collections/types?q=Pants)
{% anchor_link "link.url", "link-url" %}
<p>Returns the URL of the link.</p>

View File

@@ -1,80 +0,0 @@
---
layout: default
title: linklist
nav:
group: Liquid Variables
---
# linklist
The <code>linklist</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "linklist.handle", "linklist-handle" %}
<p>Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of the linklist.</p>
{% anchor_link "linklist.id", "linklist-id" %}
<p>Returns the id of the linklist.</p>
{% anchor_link "linklist.links", "linklist-links" %}
<p>Returns an array of <a href="/themes/liquid-documentation/objects/link/">links</a> in the linklist.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for link in linklists.main-menu.links %}
<a href="{{ link.url }}">{{ link.title }}</a>
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/">Home</a>
<a href="/collections/all">Catalog</a>
<a href="/blogs/news">Blog</a>
<a href="/pages/about-us">About Us</a>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "linklist.title", "linklist-title" %}
<p>Returns the title of the linklist.</p>

View File

@@ -1,100 +0,0 @@
---
layout: default
title: metafield
nav:
group: Liquid Variables
---
# metafields
The <code>metafields</code> object allows you to store additional information for products, collections, orders, blogs, pages and your shop. You can output metafields on your storefront using Liquid.
There are several Shopify apps and browser add-ons that make use of the [Shopify API](/api/metafield) to let you manage your metafields:
* [Shopify FD](http://shopify.freakdesign.com.au/#ShopifyFD) to create and edit metafields
* [Custom Fields](http://shopify.freakdesign.com.au/#customfields) to edit your metafields
* [Metafields Editor](http://apps.shopify.com/metafields-editor)
* [Metafields2](http://apps.shopify.com/metafields2)
A metafield consists of a namespace, a key, a value, and a description (optional). Use the namespace to group different metafields together in a logical way.
You can also specify metafields as either integers or strings. That way, youll end up with the right type of data when you use the metafields in your Liquid.
For example, if youve added two metafields to a product, and each metafield has the following attributes:
<table>
<tr>
<th>Namespace</th>
<th>Key</th>
<th>Value</th>
</tr>
<tbody>
<tr>
<td>instructions</td>
<td>Wash</td>
<td>Cold</td>
</tr>
<tr>
<td>instructions</td>
<td>Dry</td>
<td>Tumble</td>
</tr>
</tbody>
</table>
You can then use the following Liquid in <tt>product.liquid</tt> to output your metafield:
<p class="input">Input</p>
{% highlight html %}
{% raw %}
{% assign instructions = product.metafields.instructions %}
{% assign key = 'Wash' %}
<ul>
<li>Wash: {{ instructions[key] }}</li>
<li>Wash: {{ instructions['Wash'] }}</li>
<li>Wash: {{ instructions.Wash }}</li>
</ul>
{% endraw %}
{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}
Wash: Cold
Wash: Cold
Wash: Cold
{% endhighlight %}
You can use the following in <tt>product.liquid</tt> to output your second metafield:
{% highlight html %}
{% raw %}
{% assign instructions = product.metafields.instructions %}
{% assign key = 'Dry' %}
<ul>
<li>Dry: {{ instructions[key] }}</li>
<li>Dry: {{ instructions['Dry'] }}</li>
<li>Dry: {{ instructions.Dry }}</li>
</ul>
{% endraw %}
{% endhighlight %}
If you need to output all metafields with the namespace _instructions_ attached to a given product, use the following Liquid:
<p class="input">Input</p>
{% highlight html %}
{% raw %}
<ul>
{% for field in product.metafields.instructions %}
<li>{{ field | first }}: {{ field | last }}</li>
{% endfor %}
</ul>
{% endraw %}
{% endhighlight %}
<p class="output">Output</p>
{% highlight html %}
Wash: Cold
Dry: Tumble
{% endhighlight %}
The key of a metafield is <code>{% raw %}{{ field | first }}{% endraw %}</code>, while the value is <code>{% raw %}{{ field | last }}{% endraw %}</code>.

View File

@@ -1,349 +0,0 @@
---
layout: default
title: order
nav:
group: Liquid Variables
---
# order
The <code>order</code> object can be accessed in order email templates, the Thank You page of the checkout, as well as in apps such as <a href="http://docs.shopify.com/manual/more/official-shopify-apps/order-printer">Order Printer</a>.
The <code>order</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "order.billing_address", "order-billing_address" %}
Returns the billing <a href="/themes/liquid-documentation/objects/address/">address</a> of the order.
{% anchor_link "order.cancelled", "order-cancelled" %}
<p>Returns <code>true</code> if an order is cancelled, returns <code>false</code>if it not.</p>
{% anchor_link "order.cancelled_at", "order-cancelled_at" %}
<p>Returns the timestamp of when an order was cancelled. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date</a> filter to format the timestamp.</p>
{% anchor_link "order.cancel_reason", "order-cancel_reason" %}
<p>Returns the cancellation reason of an order, if it was cancelled.</p>
{% anchor_link "order.created_at", "order-created_at" %}
<p>Returns the timestamp of when an order was created. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date</a> filter to format the timestamp.</p>
{% anchor_link "order.customer", "order-customer" %}
<p>Returns the <a href="/themes/liquid-documentation/objects/customer/">customer</a> associated to the order.
{% anchor_link "order.customer_url", "order-customer_url" %}
<p>Returns the URL of the customer's account page.</p>
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{{ order.name | link_to: order.customer_url }}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
http://john-apparel.myshopify.com/account/orders/d94ec4a1956f423dc4907167c9ef0413
{% endraw %}{% endhighlight %}</div>
{% anchor_link "order.discounts", "order-discounts" %}
<p>Returns an array of <a href="/themes/liquid-documentation/objects/discount/">discounts</a> for an order.</p>
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{% for discount in order.discounts %}
Code: {{ discount.code }}
Savings: {{ discount.savings | money }}
{% endfor %}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
Code: SUMMER2014
Savings: -€50
{% endraw %}{% endhighlight %}</div>
{% anchor_link "order.email", "order-email" %}
<p>Returns the email associated with an order.</p>
{% anchor_link "order.financial_status", "order-financial_status" %}
<p>Returns the financial status of an order. The possible values are:</p>
- pending
- authorized
- paid
- partially_paid
- refunded
- partially_refunded
- voided
{% anchor_link "order.fulfillment_status", "order-fulfillment_status" %}
<p>Returns the fulfillment status of an order.</p>
{% anchor_link "order.line_items", "order-line_items" %}
<p>Returns an array of <a href="/themes/liquid-documentation/objects/line_item/">line items</a> from the order.</p>
{% anchor_link "order.location", "order-location" %}
<p><strong>POS Only</strong>. Displays the physical location of the order. You can configure locations in the <a href="http://shopify.com/admin/settings/locations">Locations settings</a> of the admin.</p>
{% anchor_link "order.name", "order-name" %}
Returns the name of the order, in the format set in the <strong>Standards & formats</strong> section of the <a href="/admin/settings/general">General Settings</a>.
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{{ order.name }}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
#1025
{% endraw %}{% endhighlight %}</div>
{% anchor_link "order.order_number", "order-order_number" %}
<p>Returns the integer representation of the order name.</p>
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{{ order.order_number }}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
1025
{% endraw %}{% endhighlight %}</div>
{% anchor_link "order.shipping_address", "order-shipping_address" %}
Returns the shipping <a href="/themes/liquid-documentation/objects/address/">address</a> of the order.
{% anchor_link "order.shipping_methods", "order-shipping_methods" %}
Returns an array of <a href="/themes/liquid-documentation/objects/shipping_method/">shipping_method</a> variables from the order.
{% anchor_link "order.shipping_price", "order-shipping_price" %}
<p>Returns the shipping price of an order. Use a <a href="/themes/liquid-documentation/filters/money-filters/">money filter</a> to return the value in a monetary format.</p>
{% anchor_link "order.subtotal_price", "order-subtotal_price" %}
<p>Returns the subtotal price of an order. Use a <a href="/themes/liquid-documentation/filters/money-filters/">money filter</a> to return the value in a monetary format.</p>
{% anchor_link "order.tax_lines", "order-tax_lines" %}
<p>Returns an array of <a href="/themes/liquid-documentation/objects/tax_line/">tax_line</a> variables for an order.</p>
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{% for tax_line in order.tax_lines %}
Tax ({{ tax_line.title }} {{ tax_line.rate | times: 100 }}%):
{{ tax_line.price | money }}
{% endfor %}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
Tax (GST 14.0%): $25
{% endraw %}{% endhighlight %}</div>
{% anchor_link "order.tax_price", "order-tax_price" %}
<p>Returns the order's tax price. Use a <a href="/themes/liquid-documentation/filters/money-filters/">money filter</a> to return the value in a monetary format.</p>
{% anchor_link "order.total_price", "order-total_price" %}
<p>Returns the total price of an order. Use a <a href="/themes/liquid-documentation/filters/money-filters/">money filter</a> to return the value in a monetary format.</p>
{% anchor_link "order.transactions", "order-transactions" %}
<p>Returns an array of <a href="/themes/liquid-documentation/objects/transaction/">transactions</a> from the order.</p>

View File

@@ -1,38 +0,0 @@
---
layout: default
title: page_description
nav:
group: Liquid Variables
---
# page_description
Returns the description of a **Product**, **Page**, or **Blog Article**, set in their respective Admin pages.
{{ '/themes/page_desc.jpg' | image }}
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ page_description }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
This is my About Us page!
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,39 +0,0 @@
---
layout: default
title: page_title
nav:
group: Liquid Variables
---
# page_title
Returns the title of a **Product**, **Page**, or **Blog Article**, set in their respective Admin pages.
{{ '/themes/page_title.jpg' | image }}
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ page_title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
About Us
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,146 +0,0 @@
---
layout: default
title: page
nav:
group: Liquid Variables
---
# page
The <code>page</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "page.author", "page.author" %}
<p>Returns the author of a page.</p>
{% anchor_link "page.content", "page-content" %}
<p>Returns the content of a page.</p>
{% anchor_link "page.handle", "page-handle" %}
<p>Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of the page. </p>
{% anchor_link "page.id", "page-id" %}
<p>Returns the id of the page.</p>
{% anchor_link "page.published_at", "page-published_at" %}
Returns the timestamp of when the page was created. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date</a> filter to format the timestamp.
{% anchor_link "page.template_suffix", "page-template_suffix" %}
Returns the name of the custom page template assigned to the page, without the <code>page.</code> prefix nor the <code>.liquid</code> suffix. Returns <code>nil</code> if a custom template is not assigned to the page.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- on page.contact.liquid -->
{{ page.template_suffix }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
contact
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "page.title", "page-title" %}
<p>Returns the title of a page.</p>
{% anchor_link "page.url", "page-url" %}
<p>Returns the relative URL of the page.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ page.url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/pages/about-us
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,161 +0,0 @@
---
layout: default
title: paginate
nav:
group: Liquid Variables
---
# paginate
The <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">paginate</a> tag's navigation is built using the attributes of the <code>paginate</code> object. You can also use the <a href="/themes/liquid-documentation/filters/additional-filters/#default_pagination">default_pagination</a> filter for a quicker alternative.
{% block "note-information" %}
The <code>paginate</code> object can only be used within <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">paginate</a> tags.
{% endblock %}
The <code>paginate</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "paginate.current_page", "paginate-current_page" %}
<p>Returns the number of the current page.</p>
{% anchor_link "paginate.current_offset", "paginate-current_offset" %}
<p>Returns the total number of items that are on the pages previous to the current one. For example, if you are paginating by 5 and are on the third page, <code>paginate.current_offset</code> would return <code>10</code>.</p>
{% anchor_link "paginate.items", "paginate-items" %}
<p>Returns the total number of items to be paginated. For example, if you are paginating a collection of 120 products, <code>paginate.items</code> would return <code>120</code>.</p>
{% anchor_link "paginate.parts", "paginate-parts" %}
<p>Returns an array of all <a href="/themes/liquid-documentation/objects/part/">parts</a> of the pagination. A <code>part</code> is a component used to build the navigation for the pagination.
{% anchor_link "paginate.next", "paginate-next" %}
Returns the <a href="/themes/liquid-documentation/objects/part/">part</a> variable for the <strong>Next</strong> link in the pagination navigation.
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{% if paginate.next.is_link %}
<a href="{{ paginate.next.url }}">{{ paginate.next.title }}</a>
{% endif %}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
<!-- If we're not on the last page, and there still needs to be a Next link -->
<a href="/collections/all?page=17">Next »</a>
{% endraw %}{% endhighlight %}</div>
{% anchor_link "paginate.previous", "paginate-previous" %}
Returns the <a href="/themes/liquid-documentation/objects/part/">part</a> variable for the <strong>Previous</strong> link in the pagination navigation.
<p class="input">Input</p>
<div>{% highlight html %}{% raw %}
{% if paginate.previous.is_link %}
<a href="{{ paginate.previous.url }}">{{ paginate.previous.title }}</a>
{% endif %}
{% endraw %}{% endhighlight %}</div>
<p class="output">Output</p>
<div>{% highlight html %}{% raw %}
<!-- If we're not on the first page, and there still needs to be a Previous link -->
<a href="/collections/all?page=15">« Previous</a>
{% endraw %}{% endhighlight %}</div>
{% anchor_link "paginate.page_size", "paginate-page_size" %}
Returns the number of items displayed per page.
{% anchor_link "paginate.pages", "paginate-pages" %}
Returns the number of pages created by the pagination tag.

View File

@@ -1,87 +0,0 @@
---
layout: default
title: part
nav:
group: Liquid Variables
---
# part
Each <code>part</code> returned by the <a href="/themes/liquid-documentation/objects/paginate/#paginate.parts">paginate.parts</a> array represents a link in the pagination's navigation.
{% block "note-information" %}
The <code>part</code> object is only accessible through the <a href="/themes/liquid-documentation/objects/paginate">paginate</a> object, and can only be used within <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">paginate</a> tags.
{% endblock %}
The example below shows how the <code>part</code> object's attributes can be accessed through a for loop that goes through the <code>paginate.parts</code> array.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for part in paginate.parts %}
{% if part.is_link %}
{{ part.title | link_to: part.url}}
{% endif %}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<a href="/collections/frontpage?page=1" title="">1</a>
<a href="/collections/frontpage?page=2" title="">2</a>
<a href="/collections/frontpage?page=3" title="">3</a>
{% endraw %}{% endhighlight %}
</div>
The <code>part</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "part.is_link", "part-is_link" %}
Returns <code>true</code> if the part is a link, returns <code>false</code> if it is not.
{% anchor_link "part.title", "part-title" %}
Returns the title of the part.
{% anchor_link "part.url", "part-url" %}
Returns the URL of the part.

View File

@@ -1,421 +0,0 @@
---
layout: default
title: product
nav:
group: Liquid Variables
---
# product
The <code>product</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "product.available", "product-available" %}
<p>Returns <code>true</code> if a product is available for purchase. Returns <code>false</code>if all of the products variants' <a href="/themes/liquid-documentation/objects/variant/#variant.inventory_quantity">inventory_quantity</a> values are zero or less, and their <a href="/themes/liquid-documentation/objects/variant/#variant.inventory_policy">inventory_policy</a> is not set to "Allow users to purchase this item, even if it is no longer in stock."</p>
{% anchor_link "product.collections", "product-collections" %}
<p>Returns an array of all of the <a href="/themes/liquid-documentation/objects/collection/">collections</a> a product belongs to.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
This product belongs in the following collections:
{% for collection in product.collections %}
{{ collection.title }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
This product belongs in the following collections:
Sale
Shirts
Spring
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.compare_at_price_max", "product-compare_at_price_max" %}
<p>Returns the highest <strong>compare at</strong> price. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "product.compare_at_price_min", "product-compare_at_price_min" %}
<p>Returns the lowest <strong>compare at</strong> price. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "product.compare_at_price_varies", "product-compare_at_price_varies" %}
<p>Returns <code>true</code> if the <code>compare_at_price_min</code> is different from the <code>compare_at_price_max</code>. Returns <code>false</code> if they are the same.</p>
{% anchor_link "product.content", "product-content" %}
<p>Returns the description of the product. Alias for <a href="#product.description">product.description</a>.</p>
{% anchor_link "product.description", "product-description" %}
<p>Returns the description of the product.</p>
{% anchor_link "product.featured_image", "product-featured_image" %}
<p>Returns the relative URL of the product's featured <a href="/themes/liquid-documentation/objects/image/">image</a>.</p>
{% anchor_link "product.handle", "product-handle" %}
Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of a product.
{% anchor_link "product.id", "product-id" %}
<p>Returns the id of the product.</p>
{% anchor_link "product.images", "product-images" %}
Returns an array of the product's <a href="/themes/liquid-documentation/objects/image/">images</a>. Use the <a href="/themes/liquid-documentation/filters/url-filters/#product_img_url">product_img_url</a> filter to link to the product image on Shopify's Content Delivery Network.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for image in product.images %}
<img src="{{ image.src | product_img_url: 'medium' }}">
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<img src="//cdn.shopify.com/s/files/1/0087/0462/products/shirt14_medium.jpeg?v=1309278311" />
<img src="http://cdn.shopify.com/s/files/1/0087/0462/products/nice_shirt_medium.jpeg?v=1331480777">
<img src="http://cdn.shopify.com/s/files/1/0087/0462/products/aloha_shirt_medium.jpeg?v=1331481001">
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.options", "product-options" %}
<p>Returns an array of the product's options.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for option in product.options %}
{{ option }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Color Size Material
{% endraw %}{% endhighlight %}
</div>
Use <a href="/themes/liquid-documentation/filters/array-filters/#size">size</a> if you need to determine how many options a product has.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ product.options.size }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
3
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.price", "product-price" %}
<p>Returns the price of the product. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "product.price_max", "product-price_max" %}
<p>Returns the highest price of the product. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "product.price_min", "product-price_min" %}
<p>Returns the lowest price of the product. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "product.price_varies", "product-price_varies" %}
<p>Returns <code>true</code> if the product's variants have varying prices. Returns <code>false</code> if all of the product's variants have the same price.</p>
{% anchor_link "product.tags", "product-tags" %}
<p>Returns an array of all of the product's tags. The tags are returned in alphabetical order.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for tag in product.tags %}
{{ tag }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
new
leather
sale
special
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.template_suffix", "product-template_suffix" %}
Returns the name of the custom product template assigned to the product, without the <code>product.</code> prefix nor the <code>.liquid</code> suffix. Returns <code>nil</code> if a custom template is not assigned to the product.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- on product.wholesale.liquid -->
{{ product.template_suffix }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
wholesale
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.title", "product-title" %}
<p>Returns the title of the product.</p>
{% anchor_link "product.type", "product-type" %}
<p>Returns the type of the product.</p>
{% anchor_link "product.url", "product-url" %}
<p>Returns the relative URL of the product.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ product.url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
/products/awesome-shoes
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "product.variants", "product-variants" %}
<p>Returns an array the product's <a href="/themes/liquid-documentation/objects/variant/">variants</a>.
{% anchor_link "product.vendor", "product-vendor" %}
<p>Returns the vendor of the product. </p>

View File

@@ -1,106 +0,0 @@
---
layout: default
title: search
nav:
group: Liquid Variables
---
# search
The <code>search</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "search.performed", "search-performed" %}
Returns <code>true</code> if an HTML form with the attribute <code>action="/search"</code> was submitted successfully. This allows you to show content based on whether a search was performed or not.
<div>
{% highlight html %}{% raw %}
{% if search.performed %}
<!-- Show search results -->
{% endif %}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "search.results", "search-results" %}
Returns an array of matching search result items. The items in the array can be a:
- <a href="/themes/liquid-documentation/objects/product/">product</a>,
- <a href="/themes/liquid-documentation/objects/article/">article</a>,
- <a href="/themes/liquid-documentation/objects/page/">page</a>.
You can access the attributes of the above three objects through <code>search.results</code>.
<div>
{% highlight html %}{% raw %}
{% for item in search.results %}
<h3>{{ item.title | link_to: item.url }}</h3>
{% if item.featured_image %}
<div class="result-image">
<a href="{{ item.url }}" title="{{ item.title | escape }}">
{{ item.featured_image.src | product_img_url: 'small' | img_tag: item.featured_image.alt }}
</a>
</div>
{% endif %}
<span>{{ item.content | strip_html | truncatewords: 40 | highlight: search.terms }}</span>
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "search.results_count", "search-results_count" %}
<p>Returns the number of results found.</p>
{% anchor_link "search.terms", "search-terms" %}
<p>Returns the string that was entered in the search input box. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#highlight">highlight</a> filter to apply a different style to any instances in the search results that match up with <code>search.terms</code>.</p>
<p class="input">Input</p>
{% highlight html %}{% raw %}
{{ item.content | highlight: search.terms }}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<!-- If the search term was "Yellow" -->
<strong class="highlight">Yellow</strong> shirts are the best!
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,95 +0,0 @@
---
layout: default
title: shipping_method
nav:
group: Liquid Variables
---
# shipping_method
The <code>shipping_method</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "shipping_method.handle", "shipping_method-handle" %}
Returns the <a href="/themes/liquid-documentation/basics/handle/">handle</a> of the shipping method. The price of the shipping rate is appended to the end of the handle.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_method.handle }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
shopify-international-shipping-25.00
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "shipping_method.price", "shipping_method-price" %}
<p>Returns the price of the shipping method. Use a <a href="/themes/liquid-documentation/filters/money-filters/">money filter</a> to return the value in a monetary format.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_method.price | money }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
$15
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "shipping_method.title", "shipping_method-title" %}
Returns the title of the shipping method.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shipping_method.title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
International Shipping
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,271 +0,0 @@
---
layout: default
title: shop
nav:
group: Liquid Variables
---
# shop
The <code>shop</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "shop.collections_count", "shop-collections_count" %}
<p>Returns the number of collections in a shop.</p>
{% anchor_link "shop.currency", "shop-currency" %}
<p>Returns the shop's currency in three-letter format (ex: USD).</p>
{% anchor_link "shop.description", "shop-description" %}
<p>Returns the description of the shop.</p>
{% anchor_link "shop.domain", "shop-domain" %}
<p>Returns the primary domain of the shop.</p>
{% anchor_link "shop.email", "shop-email" %}
<p>Returns the shop's email address.</p>
{% anchor_link "shop.enabled_payment_types", "shop-enabled_payment_types" %}
<p>Returns an array of accepted credit cards for the shop. Use the <a href="/themes/liquid-documentation/filters/url-filters/#payment_type_img_url">payment_type_img_url</a> filter to link to the SVG image file of the credit card.</p>
The available values for this array are:
- visa
- master
- american_express
- paypal
- jcb
- diners_club
- maestro
- google_wallet
- discover
- solo
- switch
- laser
- dankort
- forbrugsforeningen
- dwolla
- bitcoin
{% anchor_link "shop.metafields", "shop-metafields" %}
<p>Returns the shop's metafields. Metafields can only be set using the Shopify API .</p>
{% anchor_link "shop.money_format", "shop-money_format" %}
<p>Returns a string that is used by Shopify to format money without showing the currency.</p>
{% anchor_link "shop.money_with_currency", "shop-money_with_currency" %}
<p>Returns a string that is used by Shopify to format money while also displaying the currency.</p>
{% anchor_link "shop.name", "shop-name" %}
<p>Returns the shop's name.</p>
{% anchor_link "shop.permanent_domain", "shop-permanent_domain" %}
<p>Returns the <strong>.myshopify.com</strong> URL of a shop.</p>
{% anchor_link "shop.products_count", "shop-products_count" %}
<p>Returns the number of products in a shop.</p>
{% anchor_link "shop.types", "shop-types" %}
<p>Returns an array of all unique product types in a shop.</p>
{% highlight html %}{% raw %}
{% for product_type in shop.types %}
{{ product_type | link_to_type }}
{% endfor %}
{% endraw %}{% endhighlight %}
{% anchor_link "shop.url", "shop-url" %}
<p>Returns the full URL of a shop.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ shop.url }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
http://johns-apparel.com
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "shop.vendors", "shop-vendors" %}
<p>Returns an array of all unique vendors in a shop.</p>
{% highlight html %}{% raw %}
{% for product_vendor in shop.vendors %}
{{ product_vendor | link_to_vendor }}
{% endfor %}
{% endraw %}{% endhighlight %}

View File

@@ -1,140 +0,0 @@
---
layout: default
title: tablerow
nav:
group: Liquid Variables
---
# tablerow
The <code>tablerow</code> object is used within the <a href="/themes/liquid-documentation/tags/iteration-tags/#tablerow">tablerow</a> tag. It contains attributes of its parent for loop.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link " tablerow.length", "tablerow-length" %}
<p>Returns the number of iterations of the <tt>tablerow</tt> loop.</p>
{% anchor_link " tablerow.index", "tablerow-index" %}
Returns the current index of the <tt>tablerow</tt> loop, starting at 1.
{% anchor_link " tablerow.index0", "tablerow-index0" %}
Returns the current index of the <tt>tablerow</tt> loop, starting at 0.
{% anchor_link " tablerow.rindex", "tablerow-rindex" %}
Returns <a href="#tablerow.index">tablerow.index</a> in reverse order.
{% anchor_link " tablerow.rindex0", "tablerow-rindex0" %}
Returns <a href="#tablerow.index0">tablerow.index0</a> in reverse order.
{% anchor_link " tablerow.first", "tablerow-first" %}
Returns <code>true</code> if it's the first iteration of the <tt>tablerow</tt> loop. Returns <code>false</code> if it is not the first iteration.
{% anchor_link "tablerow.last", "tablerow-last" %}
Returns <code>true</code> if it's the last iteration of the <tt>tablerow</tt> loop. Returns <code>false</code> if it is not the last iteration.
{% anchor_link "tablerow.col", "tablerow-col" %}
Returns the index of the current row, starting at 1.
{% anchor_link "tablerow.col0", "tablerow-col0" %}
Returns the index of the current row, starting at 0.
{% anchor_link "tablerow.col_first", "tablerow-col_first" %}
Returns <code>true</code> if the current column is the first column in a row, returns <code>false</code> if it is not.
{% anchor_link " tablerow.col_last", "tablerow-col_last" %}
Returns <code>true</code> if the current column is the last column in a row, returns <code>false</code> if it is not.

View File

@@ -1,114 +0,0 @@
---
layout: default
title: tax_line
nav:
group: Liquid Variables
---
# tax_line
The <code>tax_line</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "tax_line.title", "tax_line-title" %}
Returns the title of the tax.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ tax_line.title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
GST
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "tax_line.price", "tax_line-price" %}
Returns the amount of the tax. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ tax_line.price | money }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
€25
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "tax_line.rate", "tax_line-rate" %}
Returns the rate of the tax in decimal notation.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ tax_line.rate }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
0.14
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "tax_line.rate_percentage", "tax_line-rate_percentage" %}
Returns the rate of the tax in percentage format.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ tax_line.rate_percentage }}%
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
14%
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,37 +0,0 @@
---
layout: default
title: template
nav:
group: Liquid Variables
---
# template
<code>template</code> returns the name of the template used to render the current page, with the <code>.liquid</code> extension omitted.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- If you're on the index.liquid template -->
{{ template }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
index
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,79 +0,0 @@
---
layout: default
title: theme
nav:
group: Liquid Variables
---
# theme
The <code>theme</code> object contains information about published themes in a shop. You can also use <code>themes</code> to iterate through both themes.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% for t in themes %}
{{ t.role }} theme: {{ t.name }}
{% endfor %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
mobile theme: minimal
main theme: radiance
{% endraw %}{% endhighlight %}
</div>
The <code>theme</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "theme.id", "theme-id" %}
Returns the theme's id. This is useful for when you want to link a user directly to the theme's Theme Settings.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
Go to your <a href="/admin/themes/{{ theme.id }}/settings">theme settings</a> to change your logo.
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Go to your <a href="/admin/themes/8196497/settings">theme settings</a> to change your logo.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "theme.role", "theme-role" %}
Returns one of the two possible roles of a theme: <code>main</code> or <code>mobile</code>.
{% anchor_link "theme.name", "theme-name" %}
Returns the name of the theme.

View File

@@ -1,122 +0,0 @@
---
layout: default
title: transaction
nav:
group: Liquid Variables
---
# transaction
The <code>transaction</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "transaction.id", "transaction-id" %}
Returns the id of the transaction.
{% anchor_link "transaction.amount", "transaction-amount" %}
Returns the amount of the transaction. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.
{% anchor_link "transaction.name", "transaction-name" %}
Returns the name of the transaction.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ transaction.name }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
c251556901.1
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "transaction.status", "transaction-status" %}
Returns the status of the transaction.
{% anchor_link "transaction.created_at", "transaction-created_at" %}
<p>Returns the timestamp of when the transaction was created. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#date">date</a> filter to format the timestamp.</p>
{% anchor_link "transaction.gateway", "transaction-gateway" %}
Returns the name of the payment gateway used for the transaction.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{{ transaction.gateway }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Cash on Delivery (COD)
{% endraw %}{% endhighlight %}
</div>
{% comment %} not including 'kind' and 'receipt' for now. No info can be found on these {% endcomment %}

View File

@@ -1,199 +0,0 @@
---
layout: default
title: variant
nav:
group: Liquid Variables
---
# variant
The <code>variant</code> object has the following attributes:
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "variant.available", "variant-available" %}
Returns <code>true</code> if the variant is available to be purchased, or <code>false</code> if it not. In order for a variant to be available, its <code>variant.inventory_quantity</code> must be greater than zero and its <code>variant.inventory_policy</code> must be <code>continue</code>.
{% anchor_link "variant.barcode", "variant-barcode" %}
<p>Returns the variant's barcode.</p>
{% anchor_link "variant.compare_at_price", "variant-compare_at_price" %}
<p>Returns the variant's compare at price. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "variant.id", "variant-id" %}
<p>Returns the variant's unique id.</p>
{% anchor_link "variant.inventory_management", "variant-inventory_management" %}
<p>Returns the variant's inventory tracking service.</p>
{% anchor_link "variant.inventory_policy", "variant-inventory_policy" %}
Returns the string <code>continue</code> if the "Allow users to purchase this item, even if it is no longer in stock." checkbox is checked in the variant options in the Admin. Returns <code>deny</code> if it is unchecked.
{% anchor_link "variant.inventory_quantity", "variant-inventory_quantity" %}
<p>Returns the variant's inventory quantity.</p>
{% anchor_link "variant.option1", "variant-option1" %}
Returns the value of the variant's first option.
{% anchor_link "variant.option2", "variant-option2" %}
Returns the value of the variant's second option.
{% anchor_link "variant.option3", "variant-option3" %}
Returns the value of the variant's third option.
{% anchor_link "variant.price", "variant-price" %}
<p>Returns the variant's price. Use one of the <a href="/themes/liquid-documentation/filters/money-filters/">money filters</a> to return the value in a monetary format.</p>
{% anchor_link "variant.sku", "variant-sku" %}
<p>Returns the variant's SKU.</p>
{% anchor_link "variant.title", "variant-title" %}
<p>Returns the concatenation of all the variant's option values, joined by a <code>/</code>.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- If variant's option1, option2, and option3 are "Red", "Small", "Wool", respectively -->
{{ variant.title }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Red / Small / Wool
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "variant.weight", "variant-weight" %}
<p>Returns the variant's weight. Use the <a href="/themes/liquid-documentation/filters/additional-filters/#weight_with_unit">weight_with_unit</a> filter to convert it to the shop's weight format.</p>

View File

@@ -1,176 +0,0 @@
---
layout: default
title: Control Flow Tags
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Control Flow Tags
Control Flow tags determine which block of code should be executed based on different conditions.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "if", "if" %}
<p>Executes a block of code only if a certain condition is met.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% if product.title == 'Awesome Shoes' %}
These shoes are awesome!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
These shoes are awesome!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "elsif / else", "elsif-else" %}
<p>Adds more conditions within an <code>if</code> or <code>unless</code> block.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- If customer.name = 'anonymous' -->
{% if customer.name == 'kevin' %}
Hey Kevin!
{% elsif customer.name == 'anonymous' %}
Hey Anonymous!
{% else %}
Hi Stranger!
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
Hey Anonymous!
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "case/when", "case-when" %}
<p>Creates a switch statement to compare a variable with different values. <code>case</code> initializes the switch statement, and <code>when</code> compares its values.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign handle = 'cake' %}
{% case handle %}
{% when 'cake' %}
This is a cake
{% when 'cookie' %}
This is a cookie
{% else %}
This is not a cake nor a cookie
{% endcase %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
This is a cake
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "unless", "unless" %}
<p>Similar to <code>if</code>, but executes a block of code only if a certain condition is <strong>not</strong> met.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% unless product.title == 'Awesome Shoes' %}
These shoes are not awesome.
{% endunless %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
These shoes are not awesome.
{% endraw %}{% endhighlight %}
</div>
This would be the equivalent of doing the following:
<div>
{% highlight html %}{% raw %}
{% if product.title != 'Awesome Shoes' %}
These shoes are not awesome.
{% endif %}
{% endraw %}{% endhighlight %}
</div>

View File

@@ -1,22 +0,0 @@
---
layout: default
title: Tags
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Tags
Liquid _tags_ are the programming logic that tells templates what to do. Tags are wrapped in: <code>{&#37;</code> <code>&#37;}</code>.
Certain tags, such as <a href="#for"><code>for</code></a> and <a href="#cycle"><code>cycle</code></a> can take on parameters. Details for each parameter can be found in their respective sections.
Tags can be broken down into four categories:
- [Control Flow Tags](/themes/liquid-documentation/tags/control-flow-tags/)
- [Iteration Tags](/themes/liquid-documentation/tags/iteration-tags/)
- [Theme Tags](/themes/liquid-documentation/tags/theme-tags/)
- [Variable Tags](/themes/liquid-documentation/tags/variable-tags/)

View File

@@ -1,459 +0,0 @@
---
layout: default
title: Iteration Tags
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Iteration Tags
Iteration Tags are used to run a block of code repeatedly.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "for", "for" %}
<p>Executes a block of code repeatedly. For a full list of attributes available within a for loop, see <a href="/themes/liquid-documentation/objects/for-loops/">forloop (object)</a>.</p>
For loops can only output a maximum of 50 results per page. In cases where there are more than 50 results, use the <a href="/themes/liquid-documentation/tags/theme-tags/#paginate">paginate</a> tag to split them across multiple pages.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% for product in collection.products %}
{{ product.title }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
hat shirt pants
{% endraw %}{% endhighlight %}
</div>
<div class="sub-sub-section">
<h2 class="parameter">parameters <span>for</span></h2>
<h4>limit</h4>
Exits the for loop at a specific index.
<br/><br/>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array limit:2 %}
{{ item }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
1 2
{% endraw %}{% endhighlight %}
</div>
<h4>offset</h4>
Starts the for loop at a specific index.
<br/><br/>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array offset:2 %}
{{ item }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
3 4
{% endraw %}{% endhighlight %}
</div>
<h4>range</h4>
Defines a range of numbers to loop through. The range can be defined by both literal and variable numbers.
<br/><br/>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign num = 4 %}
{% for i in (1..num) %}
{{ i }}
{% endfor %}
{% for i in (3..5) %}
{{ i }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
1 2 3 4
3 4 5
{% endraw %}{% endhighlight %}
</div>
<h4>reversed
</h4>
Reverses the order of the for loop.
<br/><br/>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<!-- if array = [1,2,3,4,5,6] -->
{% for item in array reversed %}
{{ item }}
{% endfor %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
6 5 4 3 2 1
{% endraw %}{% endhighlight %}
</div>
</div>
{% anchor_link "cycle", "cycle" %}
Loops through a group of strings and outputs them in the order that they were passed as parameters. Each time <code>cycle</code> is called, the next string that was passed as a parameter is output.
<code>cycle</code> must be used within a <a href="#for">for</a> loop block.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
one
two
three
one
{% endraw %}{% endhighlight %}
</div>
Uses for <code>cycle</code> include:
- applying odd/even classes to rows in a table
- applying a unique class to the last product thumbnail in a row
<div class="sub-sub-section">
<h2 class="parameter">parameters <span>cycle</span></h2>
<code>cycle</code> accepts a parameter called <strong>cycle group</strong> in cases where you need multiple <code>cycle</code> 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.
<p>The example below shows why cycle groups are necessary when there are multiple instances of the cycle block.</p>
<div>
{% highlight html %}{% raw %}
<ul>
{% for product in collections.collection-1.products %}
<li{% cycle ' style="clear:both;"', '', '', ' class="last"' %}>
<a href="{{ product.url | within: collection }}">
<img src="{{ product.featured_image.src | product_img_url: 'medium' }}" alt="{{ product.featured_image.alt }}" />
</a>
</li>
{% endfor %}
</ul>
<ul>
{% for product in collections.collection-2.products %}
<li{% cycle ' style="clear:both;"', '', '', ' class="last"' %}>
<a href="{{ product.url | within: collection }}">
<img src="{{ product.featured_image.src | product_img_url: 'medium' }}" alt="{{ product.featured_image.alt }}" />
</a>
</li>
{% endfor %}
</ul>
{% endraw %}{% endhighlight %}
</div>
<p>In the code above, if the first collection only has two products, the second collection loop will continue the <code>cycle</code> where the first one left off. This will result in this undesired output:</p>
<div>
{% highlight html %}{% raw %}
<ul style="clear:both">
<li></li>
</ul>
<ul>
<li></li>
<li class="last"></li>
<li style="clear:both"></li>
<li></li>
</ul>
{% endraw %}{% endhighlight %}
</div>
<p>To avoid this, cycle groups are used for each <code>cycle</code> block, as shown below.</p>
<div>
{% highlight html %}{% raw %}
<ul>
{% for product in collections.collection-1.products %}
<li{% cycle 'group1': ' style="clear:both;"', '', '', ' class="last"' %}>
<a href="{{ product.url | within: collection }}">
<img src="{{ product.featured_image.src | product_img_url: "medium" }}" alt="{{ product.featured_image.alt }}" />
</a>
</li>
{% endfor %}
</ul>
<ul>
{% for product in collections.collection-2.products %}
<li{% cycle 'group2': ' style="clear:both;"', '', '', ' class="last"' %}>
<a href="{{ product.url | within: collection }}">
<img src="{{ product.featured_image.src | product_img_url: "medium" }}" alt="{{ product.featured_image.alt }}" />
</a>
</li>
{% endfor %}
</ul>
{% endraw %}{% endhighlight %}
</div>
<p>With the code above, the two <code>cycle</code> blocks are independent of each other. The result is shown below:</p>
<div>
{% highlight html %}{% raw %}
<ul>
<li style="clear:both"></li>
<li></li>
</ul>
<!-- new cycle group starts! -->
<ul>
<li style="clear:both"></li>
<li></li>
<li></li>
<li class="last"></li>
</ul>
{% endraw %}{% endhighlight %}
</div>
</div>
{% anchor_link "tablerow", "tablerow" %}
<p>Generates an HTML <code>&#60;table&#62;</code>. Must be wrapped in an opening &lt;table&gt; and closing &lt;/table&gt; HTML tags. For a full list of attributes available within a tablerow loop, see <a href="/themes/liquid-documentation/objects/tablerow">tablerow (object)</a>.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
<table>
{% tablerow product in collection.products %}
{{ product.title }}
{% endtablerow %}
</table>
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<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>
{% endraw %}{% endhighlight %}
</div>
<div class="sub-sub-section">
<h2 class="parameter">parameters <span>tablerow</span></h2>
<h4>cols</h4>
Defines how many columns the tables should have.
<br/><br/>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% tablerow product in collection.products cols:2 %}
{{ product.title }}
{% endtablerow %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<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>
{% endraw %}{% endhighlight %}
</div>
<h4>limit</h4>
Exits the tablerow after a specific index.
<br/><br/>
<div>
{% highlight html %}{% raw %}
{% tablerow product in collection.products cols:2 limit:3 %}
{{ product.title }}
{% endtablerow %}
{% endraw %}{% endhighlight %}
</div>
<h4>offset</h4>
Starts the tablerow after a specific index.
<br/><br/>
<div>
{% highlight html %}{% raw %}
{% tablerow product in collection.products cols:2 offset:3 %}
{{ product.title }}
{% endtablerow %}
{% endraw %}{% endhighlight %}
</div>
<h4>range</h4>
Defines a range of numbers to loop through. The range can be defined by both literal and variable numbers.
<br/><br/>
<div>
{% highlight html %}{% raw %}
<!--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>
{% endraw %}{% endhighlight %}
</div>
</div>

View File

@@ -1,440 +0,0 @@
---
layout: default
title: Theme Tags
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Theme Tags
Theme Tags have various functions, including:
- Outputting template-specific HTML markup
- Telling the theme which layout and snippets to use
- Splitting a returned array into multiple pages.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "comment", "comment" %}
<p>Allows you to leave un-rendered code inside a Liquid template. Any text within the opening and closing <code>comment</code> blocks will not be output, and any Liquid code within will not be executed.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
My name is {% comment %}super{% endcomment %} Shopify.
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
My name is Shopify.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "include", "include" %}
Inserts a snippet from the **snippets** folder of a theme.
{% highlight html %}{% raw %}
{% include 'snippet-name' %}
{% endraw %}{% endhighlight %}
Note that the <tt>.liquid</tt> extension is omitted in the above code.
When a snippet is included, the code inside it will have access to the variables within its parent template.
<h2 class="parameter">parameters <span>include</span></h2>
#### with
The <code>with</code> parameter assigns a value to a variable inside a snippet that shares the same name as the snippet.
For example, we can have a snippet named **color.liquid** which contains the following:
{% highlight html %}{% raw %}
color: '{{ color }}'
shape: '{{ shape }}'
{% endraw %}{% endhighlight %}
Within **theme.liquid**, we can include the **color.liquid** snippet as follows:
{% highlight html %}{% raw %}
{% assign shape = 'circle' %}
{% include 'color' %}
{% include 'color' with 'red' %}
{% include 'color' with 'blue' %}
{% assign shape = 'square' %}
{% include 'color' with 'red' %}
{% endraw %}{% endhighlight %}
The output will be:
{% highlight html %}{% raw %}
color: shape: 'circle'
color: 'red' shape: 'circle'
color: 'blue' shape: 'circle'
color: 'red' shape: 'square'
{% endraw %}{% endhighlight %}
{% anchor_link "form", "form" %}
Creates an HTML <code>&#60;form&#62;</code> element with all the necessary attributes (action, id, etc.) and <code>&#60;input&#62;</code> to submit the form successfully.
<h2 class="parameter">parameters <span>form</span></h2>
#### activate_customer_password
Generates a form for activating a customer account on the <a href="/themes/theme-development/templates/customers-activate-account/">activate_account.liquid</a> template.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'activate_customer_password' %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="https://my-shop.myshopify.com/account/activate" method="post">
<input name="form_type" type="hidden" value="activate_customer_password" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### new_comment
Generates a form for creating a new comment in the <a href="/themes/theme-development/templates/article-liquid/">article.liquid</a> template. Requires the <code>article</code> object as a parameter.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form "new_comment", article %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="/blogs/news/10582441-my-article/comments" class="comment-form" id="article-10582441-comment-form" method="post">
<input name="form_type" type="hidden" value="new_comment" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### contact
Generates a form for submitting an email through the <a href="/manual/configuration/store-customization/communicating-with-customers/provide-contact-points/add-a-contact-form">Liquid contact form</a>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'contact' %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="/contact" class="contact-form" method="post">
<input name="form_type" type="hidden" value="contact" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### create_customer
Generates a form for creating a new customer account on the <a href="/themes/theme-development/templates/customers-register/">register.liquid</a> template.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'create_customer' %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="https://my-shop.myshopify.com/account" id="create_customer" method="post">
<input name="form_type" type="hidden" value="create_customer" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### customer_address
Generates a form for creating or editing customer account addresses on the <a href="/themes/theme-development/templates/customers-addresses/">addresses.liquid</a> template. When creating a new address, include the parameter <code>customer.new_address</code>. When editing an existing address, include the parameter <code>address</code>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'customer_address', customer.new_address %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="/account/addresses/70359392" id="address_form_70359392" method="post">
<input name="form_type" type="hidden" value="customer_address" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### customer_login
Generates a form for logging into Customer Accounts on the <a href="/themes/theme-development/templates/customers-login/">login.liquid</a> template.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'customer_login' %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="https://my-shop.myshopify.com/account/login" id="customer_login" method="post">
<input name="form_type" type="hidden" value="customer_login" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
#### recover_customer_password
Generates a form for recovering a lost password on the <a href="/themes/theme-development/templates/customers-login/">login.liquid</a> template.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% form 'recover_customer_password' %}
...
{% endform %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
<form accept-charset="UTF-8" action="/account/recover" method="post">
<input name="form_type" type="hidden" value="recover_customer_password" />
<input name="utf8" type="hidden" value="✓" />
...
</form>
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "layout", "layout" %}
Loads an alternate template file from the **layout** folder of a theme. If no alternate layout is defined, the **theme.liquid** template is loaded by default.
{% highlight html %}{% raw %}
<!-- loads the templates/alternate.liquid template -->
{% layout 'alternate' %}
{% endraw %}{% endhighlight %}
If you don't want **any** layout to be used on a specific template, you can use <code>none</code>.
{% highlight html %}{% raw %}
{% layout none %}
{% endraw %}{% endhighlight %}
{% anchor_link "paginate", "paginate" %}
Splitting products, blog articles, and search results across multiple pages is a necessary component of theme design as you are limited to 50 results per page in any <a href="/themes/liquid-documentation/tags/iteration-tags/#for">for</a> loop.
The <code>paginate</code> tag works in conjunction with the <code> for </code> tag to split content into numerous pages. It must wrap a <code>for</code> tag block that loops through an array, as shown in the example below:
{% highlight html %}{% raw %}
{% paginate collection.products by 5 %}
{% for product in collection.products %}
<!--show product details here -->
{% endfor %}
{% endpaginate %}
{% endraw %}{% endhighlight %}
The <code>by</code> parameter is followed by an integer <strong>between 1 and 50</strong> that tells the <code>paginate</code> tag how many results it should output per page.
Within <code>paginate</code> tags, you can access attributes of the <a href="/themes/liquid-documentation/objects/paginate/">paginate</a> object. This includes the attributes to output the links required to navigate within the generated pages.
{% comment %}
{% block "note-caution" %}
Accessing any attributes of the array you are paginating <em>before</em> the opening <code>paginate</code> tag will cause errors. To avoid this, make sure any variables
{% endblock %}
**Bad Example**
<div>
{% highlight html %}{% raw %}
{{ collection.title }}
{% paginate collection.products by 5 %}
{% for product in collection.products %}
{{ product.title }}
{% endfor %}
{% endpaginate %}
{% endraw %}{% endhighlight %}
</div>
**Good Example**
<div>
{% highlight html %}{% raw %}
{% paginate collection.products by 5 %}
{% for product in collection.products %}
<!--show product details here -->
{% endfor %}
{% endpaginate %}
{% endraw %}{% endhighlight %}
</div>
{% endcomment %}
{% anchor_link "raw", "raw" %}
<p>Allows output of Liquid code on a page without being parsed.</p>
<p class="input">Input</p>
<div>
<div class="highlight"><pre><code class="html">&#123;% raw %&#125;&#123;&#123; 5 | plus: 6 &#125;&#125;&#123;% endraw %&#125; is equal to 11.</code></pre></div>
</div>
<p class="output">Output</p>
<div>
<div class="highlight"><pre><code class="html">&#123;&#123; 5 | plus: 6 &#125;&#125; is equal to 11.</code></pre></div>
</div>

View File

@@ -1,219 +0,0 @@
---
layout: default
title: Variable Tags
landing_as_article: true
nav:
group: Liquid Documentation
weight: 1
---
# Variable Tags
Variable Tags are used to create new Liquid variables.
<a id="topofpage"></a>
{% table_of_contents %}
{% anchor_link "assign", "assign" %}
<p>Creates a new variable.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign my_variable = false %}
{% if my_variable != true %}
This statement is valid.
{% endif %}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
This statement is valid.
{% endraw %}{% endhighlight %}
</div>
Use quotations ("") to save the variable as a string.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign foo = "bar" %}
{{ foo }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
bar
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "capture", "capture" %}
<p>Captures the string inside of the opening and closing tags and assigns it to a variable. By default, variables created through {&#37; capture &#37;} are strings; use the <a href="/themes/liquid-documentation/filters/string-filters/#to_number">to_number</a> filter to convert the string into a number.</p>
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% capture my_variable %}I am being captured.{% endcapture %}
{{ my_variable }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
I am being captured.
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "increment", "increment" %}
Creates a new number variable, and increases its value by one every time it is called. The initial value is 0.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% increment variable %}
{% increment variable %}
{% increment variable %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
0
1
2
{% endraw %}{% endhighlight %}
</div>
Variables created through the <code>increment</code> tag are independent from variables created through <code>assign</code> or <code>capture</code>.
In the example below, a variable named "var" is created through <code>assign</code>. The <code>increment</code> tag is then used several times on a variable with the same name. However, note that the <code>increment</code> tag does not affect the value of "var" that was created through <code>assign</code>.
<p class="input">Input</p>
<div>
{% highlight html %}{% raw %}
{% assign var = 10 %}
{% increment var %}
{% increment var %}
{% increment var %}
{{ var }}
{% endraw %}{% endhighlight %}
</div>
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
0
1
2
10
{% endraw %}{% endhighlight %}
</div>
{% anchor_link "decrement", "decrement" %}
Creates a new number variable, and decreases its value by one every time it is called. The initial value is -1.
<p class="input">Input</p>
{% highlight html %}{% raw %}
{% decrement variable %}
{% decrement variable %}
{% decrement variable %}
{% endraw %}{% endhighlight %}
<p class="output">Output</p>
<div>
{% highlight html %}{% raw %}
-1
-2
-3
{% endraw %}{% endhighlight %}
</div>
Like <a href="#increment">increment</a>, variables declared inside <code>decrement</code> are independent from variables created through <code>assign</code> or <code>capture</code>.

View File

@@ -1,3 +0,0 @@
#### Liquid Docs
Home of the Liquid Docs

View File

@@ -1,139 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>About</title>
<meta name="viewport" content="width=device-width">
<meta name="description" content="Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.">
<link rel="canonical" href="http://yourdomain.com/about/">
<!-- Custom CSS -->
<link rel="stylesheet" href="/css/stylesheets/main.css">
</head>
<body>
<header class="site-header">
<div class="wrap">
<a class="site-title" href="/">Your awesome title</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
<path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="/about/">About</a>
</div>
</nav>
</div>
</header>
<div class="page-content">
<div class="wrap">
<div class="post">
<header class="post-header">
<h1>About</h1>
</header>
<article class="post-content">
<p>This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at <a href="http://jekyllrb.com/">jekyllrb.com</a></p>
<p>You can find the source code for the Jekyll new theme at: <a href="https://github.com/jglovier/jekyll-new">github.com/jglovier/jekyll-new</a></p>
<p>You can find the source code for Jekyll at <a href="https://github.com/jekyll/jekyll">github.com/jekyll/jekyll</a></p>
</article>
</div>
</div>
</div>
<footer class="site-footer">
<div class="wrap">
<h2 class="footer-heading">Your awesome title</h2>
<div class="footer-col-1 column">
<ul>
<li>Your awesome title</li>
<li><a href="mailto:your-email@domain.com">your-email@domain.com</a></li>
</ul>
</div>
<div class="footer-col-2 column">
<ul>
<li>
<a href="https://github.com/jekyll">
<span class="icon github">
<svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
<span class="username">jekyll</span>
</a>
</li>
<li>
<a href="https://twitter.com/jekyllrb">
<span class="icon twitter">
<svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
</svg>
</span>
<span class="username">jekyllrb</span>
</a>
</li>
</ul>
</div>
<div class="footer-col-3 column">
<p class="text">Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</p>
</div>
</div>
</footer>
</body>
</html>

View File

@@ -1,24 +0,0 @@
# Require any additional compass plugins here.
# Set this to the root of your project when deployed:
http_path = "/"
css_dir = "stylesheets"
sass_dir = "sass"
images_dir = "images"
javascripts_dir = "javascripts"
# You can select your preferred output style here (can be overridden via the command line):
# output_style = :expanded or :nested or :compact or :compressed
# To enable relative paths to assets via compass helper functions. Uncomment:
# relative_assets = true
# To disable debugging comments that display the original location of your selectors. Uncomment:
# line_comments = false
# If you prefer the indented syntax, you might want to regenerate this
# project again passing --syntax sass, or you can uncomment this:
# preferred_syntax = :sass
# and then run:
# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass

View File

@@ -1,5 +0,0 @@
/* Welcome to Compass. Use this file to write IE specific override styles.
* Import this file using the following HTML or equivalent:
* <!--[if IE]>
* <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
* <![endif]--> */

View File

@@ -1,412 +0,0 @@
/*sadfasdf*/
/* Base */
/* ----------------------------------------------------------*/
* {
margin: 0;
padding: 0;
}
html, body { height: 100%; }
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
font-weight: 300;
background-color: #fdfdfd;
}
h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: 400; }
a { color: #2a7ae2; text-decoration: none; }
a:hover { color: #000; text-decoration: underline; }
a:visited { color: #205caa; }
/* Utility */
.wrap:before,
.wrap:after { content:""; display:table; }
.wrap:after { clear: both; }
.wrap {
max-width: 800px;
padding: 0 30px;
margin: 0 auto;
zoom: 1;
}
/* Layout Styles */
/* ----------------------------------------------------------*/
/* Site header */
.site-header {
border-top: 5px solid #333;
border-bottom: 1px solid #e8e8e8;
min-height: 56px;
background-color: white;
}
.site-title,
.site-title:hover,
.site-title:visited {
display: block;
color: #333;
font-size: 26px;
letter-spacing: -1px;
float: left;
line-height: 56px;
position: relative;
z-index: 1;
}
.site-nav {
float: right;
line-height: 56px;
}
.site-nav .menu-icon { display: none; }
.site-nav .page-link {
margin-left: 20px;
color: #727272;
letter-spacing: -.5px;
}
/* Site footer */
.site-footer {
border-top: 1px solid #e8e8e8;
padding: 30px 0;
}
.footer-heading {
font-size: 18px;
font-weight: 300;
letter-spacing: -.5px;
margin-bottom: 15px;
}
.site-footer .column { float: left; margin-bottom: 15px; }
.footer-col-1 {
width: 270px; /*fallback*/
width: -webkit-calc(35% - 10px);
width: -moz-calc(35% - 10px);
width: -o-calc(35% - 10px);
width: calc(35% - 10px);
margin-right: 10px
}
.footer-col-2 {
width: 175px; /*fallback*/
width: -webkit-calc(23.125% - 10px);
width: -moz-calc(23.125% - 10px);
width: -o-calc(23.125% - 10px);
width: calc(23.125% - 10px);
margin-right: 10px
}
.footer-col-3 {
width: 335px; /*fallback*/
width: -webkit-calc(41.875%);
width: -moz-calc(41.875%);
width: -o-calc(41.875%);
width: calc(41.875%);
}
.site-footer ul { list-style: none; }
.site-footer li,
.site-footer p {
font-size: 15px;
letter-spacing: -.3px;
color: #828282;
}
.github-icon-svg,
.twitter-icon-svg {
display: inline-block;
width: 16px;
height: 16px;
position: relative;
top: 3px;
}
/* Page Content styles */
/* ----------------------------------------------------------*/
.page-content {
padding: 30px 0;
background-color: #fff;
}
/* Home styles */
/* ----------------------------------------------------------*/
.home h1 { margin-bottom: 25px; }
.posts { list-style-type: none; }
.posts li { margin-bottom: 30px; }
.posts .post-link {
font-size: 24px;
letter-spacing: -1px;
line-height: 1;
}
.posts .post-date {
display: block;
font-size: 15px;
color: #818181;
}
/* Post styles */
/* ----------------------------------------------------------*/
.post-header { margin: 10px 0 30px; }
.post-header h1 {
font-size: 42px;
letter-spacing: -1.75px;
line-height: 1;
font-weight: 300;
}
.post-header .meta {
font-size: 15px;
color: #818181;
margin-top: 5px;
}
.post-content { margin: 0 0 30px; }
.post-content > * { margin: 20px 0; }
.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5,
.post-content h6 {
line-height: 1;
font-weight: 300;
margin: 40px 0 20px;
}
.post-content h2 {
font-size: 32px;
letter-spacing: -1.25px;
}
.post-content h3 {
font-size: 26px;
letter-spacing: -1px;
}
.post-content h4 {
font-size: 20px;
letter-spacing: -1px;
}
.post-content blockquote {
border-left: 4px solid #e8e8e8;
padding-left: 20px;
font-size: 18px;
opacity: .6;
letter-spacing: -1px;
font-style: italic;
margin: 30px 0;
}
.post-content ul,
.post-content ol { padding-left: 20px; }
.post pre,
.post code {
border: 1px solid #d5d5e9;
background-color: #eef;
padding: 8px 12px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
font-size: 15px;
overflow:scroll;
}
.post code { padding: 1px 5px; }
.post ul,
.post ol { margin-left: 1.35em; }
.post pre code {
border: 0;
padding-right: 0;
padding-left: 0;
}
/* terminal */
.post pre.terminal {
border: 1px solid #000;
background-color: #333;
color: #FFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.post pre.terminal code { background-color: #333; }
/* Syntax highlighting styles */
/* ----------------------------------------------------------*/
.highlight { background: #ffffff; }
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { font-weight: bold } /* Keyword */
.highlight .o { font-weight: bold } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { font-weight: bold } /* Keyword.Constant */
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #d14 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #0086B3 } /* Name.Builtin */
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
.highlight .no { color: #008080 } /* Name.Constant */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
.highlight .sc { color: #d14 } /* Literal.String.Char */
.highlight .sd { color: #d14 } /* Literal.String.Doc */
.highlight .s2 { color: #d14 } /* Literal.String.Double */
.highlight .se { color: #d14 } /* Literal.String.Escape */
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
.highlight .si { color: #d14 } /* Literal.String.Interpol */
.highlight .sx { color: #d14 } /* Literal.String.Other */
.highlight .sr { color: #009926 } /* Literal.String.Regex */
.highlight .s1 { color: #d14 } /* Literal.String.Single */
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
/* media queries */
/* ----------------------------------------------------------*/
@media screen and (max-width: 750px) {
.footer-col-1 { width: 50%; }
.footer-col-2 {
width: 45%; /*fallback*/
width: -webkit-calc(50% - 10px);
width: -moz-calc(50% - 10px);
width: -o-calc(50% - 10px);
width: calc(50% - 10px);
margin-right: 0;
}
.site-footer .column.footer-col-3 {
width: auto;
float: none;
clear: both;
}
}
@media screen and (max-width: 600px) {
.wrap { padding: 0 12px; }
.site-nav {
position: fixed;
z-index: 10;
top: 14px; right: 8px;
background-color: white;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
border: 1px solid #e8e8e8;
}
.site-nav .menu-icon {
display: block;
font-size: 24px;
color: #505050;
float: right;
width: 36px;
text-align: center;
line-height: 36px;
}
.site-nav .menu-icon svg { width: 18px; height: 16px; }
.site-nav .trigger {
clear: both;
margin-bottom: 5px;
display: none;
}
.site-nav:hover .trigger { display: block; }
.site-nav .page-link {
display: block;
text-align: right;
line-height: 1.25;
padding: 5px 10px;
margin: 0;
}
.post-header h1 { font-size: 36px; }
.post-content h2 { font-size: 28px; }
.post-content h3 { font-size: 22px; }
.post-content h4 { font-size: 18px; }
.post-content blockquote { padding-left: 10px; }
.post-content ul,
.post-content ol { padding-left: 10px; }
.site-footer .column {
float: none;
clear: both;
width: auto;
margin: 0 0 15px; }
}

View File

@@ -1,4 +0,0 @@
/* Welcome to Compass. Use this file to define print styles.
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */

View File

@@ -1,6 +0,0 @@
/* Welcome to Compass.
* In this file you should write your main styles. (or centralize your imports)
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> */
@import "compass/reset";

View File

@@ -1,5 +0,0 @@
/* Welcome to Compass. Use this file to write IE specific override styles.
* Import this file using the following HTML or equivalent:
* <!--[if IE]>
* <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
* <![endif]--> */

View File

@@ -1,849 +0,0 @@
/*sadfasdf*/
/* Base */
/* ----------------------------------------------------------*/
/* line 6, ../sass/main.scss */
* {
margin: 0;
padding: 0;
}
/* line 11, ../sass/main.scss */
html, body {
height: 100%;
}
/* line 13, ../sass/main.scss */
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
font-weight: 300;
background-color: #fdfdfd;
}
/* line 21, ../sass/main.scss */
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
font-weight: 400;
}
/* line 23, ../sass/main.scss */
a {
color: #2a7ae2;
text-decoration: none;
}
/* line 24, ../sass/main.scss */
a:hover {
color: #000;
text-decoration: underline;
}
/* line 25, ../sass/main.scss */
a:visited {
color: #205caa;
}
/* Utility */
/* line 30, ../sass/main.scss */
.wrap:before,
.wrap:after {
content: "";
display: table;
}
/* line 31, ../sass/main.scss */
.wrap:after {
clear: both;
}
/* line 32, ../sass/main.scss */
.wrap {
max-width: 800px;
padding: 0 30px;
margin: 0 auto;
zoom: 1;
}
/* Layout Styles */
/* ----------------------------------------------------------*/
/* Site header */
/* line 45, ../sass/main.scss */
.site-header {
border-top: 5px solid #333;
border-bottom: 1px solid #e8e8e8;
min-height: 56px;
background-color: white;
}
/* line 54, ../sass/main.scss */
.site-title,
.site-title:hover,
.site-title:visited {
display: block;
color: #333;
font-size: 26px;
letter-spacing: -1px;
float: left;
line-height: 56px;
position: relative;
z-index: 1;
}
/* line 65, ../sass/main.scss */
.site-nav {
float: right;
line-height: 56px;
}
/* line 70, ../sass/main.scss */
.site-nav .menu-icon {
display: none;
}
/* line 72, ../sass/main.scss */
.site-nav .page-link {
margin-left: 20px;
color: #727272;
letter-spacing: -.5px;
}
/* Site footer */
/* line 80, ../sass/main.scss */
.site-footer {
border-top: 1px solid #e8e8e8;
padding: 30px 0;
}
/* line 85, ../sass/main.scss */
.footer-heading {
font-size: 18px;
font-weight: 300;
letter-spacing: -.5px;
margin-bottom: 15px;
}
/* line 92, ../sass/main.scss */
.site-footer .column {
float: left;
margin-bottom: 15px;
}
/* line 94, ../sass/main.scss */
.footer-col-1 {
width: 270px;
/*fallback*/
width: -webkit-calc(35% - 10px);
width: -moz-calc(35% - 10px);
width: -o-calc(35% - 10px);
width: calc(35% - 10px);
margin-right: 10px;
}
/* line 102, ../sass/main.scss */
.footer-col-2 {
width: 175px;
/*fallback*/
width: -webkit-calc(23.125% - 10px);
width: -moz-calc(23.125% - 10px);
width: -o-calc(23.125% - 10px);
width: calc(23.125% - 10px);
margin-right: 10px;
}
/* line 110, ../sass/main.scss */
.footer-col-3 {
width: 335px;
/*fallback*/
width: -webkit-calc(41.875%);
width: -moz-calc(41.875%);
width: -o-calc(41.875%);
width: calc(41.875%);
}
/* line 118, ../sass/main.scss */
.site-footer ul {
list-style: none;
}
/* line 121, ../sass/main.scss */
.site-footer li,
.site-footer p {
font-size: 15px;
letter-spacing: -.3px;
color: #828282;
}
/* line 128, ../sass/main.scss */
.github-icon-svg,
.twitter-icon-svg {
display: inline-block;
width: 16px;
height: 16px;
position: relative;
top: 3px;
}
/* Page Content styles */
/* ----------------------------------------------------------*/
/* line 140, ../sass/main.scss */
.page-content {
padding: 30px 0;
background-color: #fff;
}
/* Home styles */
/* ----------------------------------------------------------*/
/* line 149, ../sass/main.scss */
.home h1 {
margin-bottom: 25px;
}
/* line 151, ../sass/main.scss */
.posts {
list-style-type: none;
}
/* line 153, ../sass/main.scss */
.posts li {
margin-bottom: 30px;
}
/* line 155, ../sass/main.scss */
.posts .post-link {
font-size: 24px;
letter-spacing: -1px;
line-height: 1;
}
/* line 161, ../sass/main.scss */
.posts .post-date {
display: block;
font-size: 15px;
color: #818181;
}
/* Post styles */
/* ----------------------------------------------------------*/
/* line 171, ../sass/main.scss */
.post-header {
margin: 10px 0 30px;
}
/* line 173, ../sass/main.scss */
.post-header h1 {
font-size: 42px;
letter-spacing: -1.75px;
line-height: 1;
font-weight: 300;
}
/* line 180, ../sass/main.scss */
.post-header .meta {
font-size: 15px;
color: #818181;
margin-top: 5px;
}
/* line 186, ../sass/main.scss */
.post-content {
margin: 0 0 30px;
}
/* line 188, ../sass/main.scss */
.post-content > * {
margin: 20px 0;
}
/* line 196, ../sass/main.scss */
.post-content h1,
.post-content h2,
.post-content h3,
.post-content h4,
.post-content h5,
.post-content h6 {
line-height: 1;
font-weight: 300;
margin: 40px 0 20px;
}
/* line 202, ../sass/main.scss */
.post-content h2 {
font-size: 32px;
letter-spacing: -1.25px;
}
/* line 207, ../sass/main.scss */
.post-content h3 {
font-size: 26px;
letter-spacing: -1px;
}
/* line 212, ../sass/main.scss */
.post-content h4 {
font-size: 20px;
letter-spacing: -1px;
}
/* line 217, ../sass/main.scss */
.post-content blockquote {
border-left: 4px solid #e8e8e8;
padding-left: 20px;
font-size: 18px;
opacity: .6;
letter-spacing: -1px;
font-style: italic;
margin: 30px 0;
}
/* line 228, ../sass/main.scss */
.post-content ul,
.post-content ol {
padding-left: 20px;
}
/* line 231, ../sass/main.scss */
.post pre,
.post code {
border: 1px solid #d5d5e9;
background-color: #eef;
padding: 8px 12px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
font-size: 15px;
overflow: scroll;
}
/* line 242, ../sass/main.scss */
.post code {
padding: 1px 5px;
}
/* line 245, ../sass/main.scss */
.post ul,
.post ol {
margin-left: 1.35em;
}
/* line 247, ../sass/main.scss */
.post pre code {
border: 0;
padding-right: 0;
padding-left: 0;
}
/* terminal */
/* line 254, ../sass/main.scss */
.post pre.terminal {
border: 1px solid #000;
background-color: #333;
color: #FFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
/* line 263, ../sass/main.scss */
.post pre.terminal code {
background-color: #333;
}
/* Syntax highlighting styles */
/* ----------------------------------------------------------*/
/* line 268, ../sass/main.scss */
.highlight {
background: #ffffff;
}
/* line 269, ../sass/main.scss */
.highlight .c {
color: #999988;
font-style: italic;
}
/* Comment */
/* line 270, ../sass/main.scss */
.highlight .err {
color: #a61717;
background-color: #e3d2d2;
}
/* Error */
/* line 271, ../sass/main.scss */
.highlight .k {
font-weight: bold;
}
/* Keyword */
/* line 272, ../sass/main.scss */
.highlight .o {
font-weight: bold;
}
/* Operator */
/* line 273, ../sass/main.scss */
.highlight .cm {
color: #999988;
font-style: italic;
}
/* Comment.Multiline */
/* line 274, ../sass/main.scss */
.highlight .cp {
color: #999999;
font-weight: bold;
}
/* Comment.Preproc */
/* line 275, ../sass/main.scss */
.highlight .c1 {
color: #999988;
font-style: italic;
}
/* Comment.Single */
/* line 276, ../sass/main.scss */
.highlight .cs {
color: #999999;
font-weight: bold;
font-style: italic;
}
/* Comment.Special */
/* line 277, ../sass/main.scss */
.highlight .gd {
color: #000000;
background-color: #ffdddd;
}
/* Generic.Deleted */
/* line 278, ../sass/main.scss */
.highlight .gd .x {
color: #000000;
background-color: #ffaaaa;
}
/* Generic.Deleted.Specific */
/* line 279, ../sass/main.scss */
.highlight .ge {
font-style: italic;
}
/* Generic.Emph */
/* line 280, ../sass/main.scss */
.highlight .gr {
color: #aa0000;
}
/* Generic.Error */
/* line 281, ../sass/main.scss */
.highlight .gh {
color: #999999;
}
/* Generic.Heading */
/* line 282, ../sass/main.scss */
.highlight .gi {
color: #000000;
background-color: #ddffdd;
}
/* Generic.Inserted */
/* line 283, ../sass/main.scss */
.highlight .gi .x {
color: #000000;
background-color: #aaffaa;
}
/* Generic.Inserted.Specific */
/* line 284, ../sass/main.scss */
.highlight .go {
color: #888888;
}
/* Generic.Output */
/* line 285, ../sass/main.scss */
.highlight .gp {
color: #555555;
}
/* Generic.Prompt */
/* line 286, ../sass/main.scss */
.highlight .gs {
font-weight: bold;
}
/* Generic.Strong */
/* line 287, ../sass/main.scss */
.highlight .gu {
color: #aaaaaa;
}
/* Generic.Subheading */
/* line 288, ../sass/main.scss */
.highlight .gt {
color: #aa0000;
}
/* Generic.Traceback */
/* line 289, ../sass/main.scss */
.highlight .kc {
font-weight: bold;
}
/* Keyword.Constant */
/* line 290, ../sass/main.scss */
.highlight .kd {
font-weight: bold;
}
/* Keyword.Declaration */
/* line 291, ../sass/main.scss */
.highlight .kp {
font-weight: bold;
}
/* Keyword.Pseudo */
/* line 292, ../sass/main.scss */
.highlight .kr {
font-weight: bold;
}
/* Keyword.Reserved */
/* line 293, ../sass/main.scss */
.highlight .kt {
color: #445588;
font-weight: bold;
}
/* Keyword.Type */
/* line 294, ../sass/main.scss */
.highlight .m {
color: #009999;
}
/* Literal.Number */
/* line 295, ../sass/main.scss */
.highlight .s {
color: #dd1144;
}
/* Literal.String */
/* line 296, ../sass/main.scss */
.highlight .na {
color: teal;
}
/* Name.Attribute */
/* line 297, ../sass/main.scss */
.highlight .nb {
color: #0086b3;
}
/* Name.Builtin */
/* line 298, ../sass/main.scss */
.highlight .nc {
color: #445588;
font-weight: bold;
}
/* Name.Class */
/* line 299, ../sass/main.scss */
.highlight .no {
color: teal;
}
/* Name.Constant */
/* line 300, ../sass/main.scss */
.highlight .ni {
color: purple;
}
/* Name.Entity */
/* line 301, ../sass/main.scss */
.highlight .ne {
color: #990000;
font-weight: bold;
}
/* Name.Exception */
/* line 302, ../sass/main.scss */
.highlight .nf {
color: #990000;
font-weight: bold;
}
/* Name.Function */
/* line 303, ../sass/main.scss */
.highlight .nn {
color: #555555;
}
/* Name.Namespace */
/* line 304, ../sass/main.scss */
.highlight .nt {
color: navy;
}
/* Name.Tag */
/* line 305, ../sass/main.scss */
.highlight .nv {
color: teal;
}
/* Name.Variable */
/* line 306, ../sass/main.scss */
.highlight .ow {
font-weight: bold;
}
/* Operator.Word */
/* line 307, ../sass/main.scss */
.highlight .w {
color: #bbbbbb;
}
/* Text.Whitespace */
/* line 308, ../sass/main.scss */
.highlight .mf {
color: #009999;
}
/* Literal.Number.Float */
/* line 309, ../sass/main.scss */
.highlight .mh {
color: #009999;
}
/* Literal.Number.Hex */
/* line 310, ../sass/main.scss */
.highlight .mi {
color: #009999;
}
/* Literal.Number.Integer */
/* line 311, ../sass/main.scss */
.highlight .mo {
color: #009999;
}
/* Literal.Number.Oct */
/* line 312, ../sass/main.scss */
.highlight .sb {
color: #dd1144;
}
/* Literal.String.Backtick */
/* line 313, ../sass/main.scss */
.highlight .sc {
color: #dd1144;
}
/* Literal.String.Char */
/* line 314, ../sass/main.scss */
.highlight .sd {
color: #dd1144;
}
/* Literal.String.Doc */
/* line 315, ../sass/main.scss */
.highlight .s2 {
color: #dd1144;
}
/* Literal.String.Double */
/* line 316, ../sass/main.scss */
.highlight .se {
color: #dd1144;
}
/* Literal.String.Escape */
/* line 317, ../sass/main.scss */
.highlight .sh {
color: #dd1144;
}
/* Literal.String.Heredoc */
/* line 318, ../sass/main.scss */
.highlight .si {
color: #dd1144;
}
/* Literal.String.Interpol */
/* line 319, ../sass/main.scss */
.highlight .sx {
color: #dd1144;
}
/* Literal.String.Other */
/* line 320, ../sass/main.scss */
.highlight .sr {
color: #009926;
}
/* Literal.String.Regex */
/* line 321, ../sass/main.scss */
.highlight .s1 {
color: #dd1144;
}
/* Literal.String.Single */
/* line 322, ../sass/main.scss */
.highlight .ss {
color: #990073;
}
/* Literal.String.Symbol */
/* line 323, ../sass/main.scss */
.highlight .bp {
color: #999999;
}
/* Name.Builtin.Pseudo */
/* line 324, ../sass/main.scss */
.highlight .vc {
color: teal;
}
/* Name.Variable.Class */
/* line 325, ../sass/main.scss */
.highlight .vg {
color: teal;
}
/* Name.Variable.Global */
/* line 326, ../sass/main.scss */
.highlight .vi {
color: teal;
}
/* Name.Variable.Instance */
/* line 327, ../sass/main.scss */
.highlight .il {
color: #009999;
}
/* Literal.Number.Integer.Long */
/* media queries */
/* ----------------------------------------------------------*/
@media screen and (max-width: 750px) {
/* line 336, ../sass/main.scss */
.footer-col-1 {
width: 50%;
}
/* line 338, ../sass/main.scss */
.footer-col-2 {
width: 45%;
/*fallback*/
width: -webkit-calc(50% - 10px);
width: -moz-calc(50% - 10px);
width: -o-calc(50% - 10px);
width: calc(50% - 10px);
margin-right: 0;
}
/* line 347, ../sass/main.scss */
.site-footer .column.footer-col-3 {
width: auto;
float: none;
clear: both;
}
}
@media screen and (max-width: 600px) {
/* line 357, ../sass/main.scss */
.wrap {
padding: 0 12px;
}
/* line 359, ../sass/main.scss */
.site-nav {
position: fixed;
z-index: 10;
top: 14px;
right: 8px;
background-color: white;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
border: 1px solid #e8e8e8;
}
/* line 370, ../sass/main.scss */
.site-nav .menu-icon {
display: block;
font-size: 24px;
color: #505050;
float: right;
width: 36px;
text-align: center;
line-height: 36px;
}
/* line 380, ../sass/main.scss */
.site-nav .menu-icon svg {
width: 18px;
height: 16px;
}
/* line 382, ../sass/main.scss */
.site-nav .trigger {
clear: both;
margin-bottom: 5px;
display: none;
}
/* line 388, ../sass/main.scss */
.site-nav:hover .trigger {
display: block;
}
/* line 390, ../sass/main.scss */
.site-nav .page-link {
display: block;
text-align: right;
line-height: 1.25;
padding: 5px 10px;
margin: 0;
}
/* line 398, ../sass/main.scss */
.post-header h1 {
font-size: 36px;
}
/* line 399, ../sass/main.scss */
.post-content h2 {
font-size: 28px;
}
/* line 400, ../sass/main.scss */
.post-content h3 {
font-size: 22px;
}
/* line 401, ../sass/main.scss */
.post-content h4 {
font-size: 18px;
}
/* line 402, ../sass/main.scss */
.post-content blockquote {
padding-left: 10px;
}
/* line 404, ../sass/main.scss */
.post-content ul,
.post-content ol {
padding-left: 10px;
}
/* line 406, ../sass/main.scss */
.site-footer .column {
float: none;
clear: both;
width: auto;
margin: 0 0 15px;
}
}

View File

@@ -1,3 +0,0 @@
/* Welcome to Compass. Use this file to define print styles.
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */

View File

@@ -1,3 +0,0 @@
/* Welcome to Compass. Use this file to define print styles.
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */

View File

@@ -1,68 +0,0 @@
/* Welcome to Compass.
* In this file you should write your main styles. (or centralize your imports)
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> */
/* line 17, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font: inherit;
font-size: 100%;
vertical-align: baseline;
}
/* line 22, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
html {
line-height: 1;
}
/* line 24, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
ol, ul {
list-style: none;
}
/* line 26, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
table {
border-collapse: collapse;
border-spacing: 0;
}
/* line 28, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
caption, th, td {
text-align: left;
font-weight: normal;
vertical-align: middle;
}
/* line 30, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q, blockquote {
quotes: none;
}
/* line 103, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q:before, q:after, blockquote:before, blockquote:after {
content: "";
content: none;
}
/* line 32, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
a img {
border: none;
}
/* line 116, ../../../../../../.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/compass-0.12.7/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
display: block;
}

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Your awesome title</title>
<description>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</description>
<link>http://yourdomain.com/</link>
<atom:link href="http://yourdomain.com/feed.xml" rel="self" type="application/rss+xml" />
<pubDate>Wed, 23 Jul 2014 11:16:35 -0400</pubDate>
<lastBuildDate>Wed, 23 Jul 2014 11:16:35 -0400</lastBuildDate>
<generator>Jekyll v2.1.1</generator>
<item>
<title>Welcome to Jekyll!</title>
<description>&lt;p&gt;Youll find this post in your &lt;code&gt;_posts&lt;/code&gt; directory - edit this post and re-build (or run with the &lt;code&gt;-w&lt;/code&gt; switch) to see your changes!
To add new posts, simply add a file in the &lt;code&gt;_posts&lt;/code&gt; directory that follows the convention: YYYY-MM-DD-name-of-post.ext.&lt;/p&gt;
&lt;p&gt;Jekyll also offers powerful support for code snippets:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;print_hi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Hi, &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;print_hi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;Tom&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#=&amp;gt; prints &amp;#39;Hi, Tom&amp;#39; to STDOUT.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check out the &lt;a href=&quot;http://jekyllrb.com&quot;&gt;Jekyll docs&lt;/a&gt; for more info on how to get the most out of Jekyll. File all bugs/feature requests at &lt;a href=&quot;https://github.com/jekyll/jekyll&quot;&gt;Jekylls GitHub repo&lt;/a&gt;.&lt;/p&gt;
</description>
<pubDate>Wed, 23 Jul 2014 06:55:39 -0400</pubDate>
<link>http://yourdomain.com/jekyll/update/2014/07/23/welcome-to-jekyll/</link>
<guid isPermaLink="true">http://yourdomain.com/jekyll/update/2014/07/23/welcome-to-jekyll/</guid>
<category>jekyll</category>
<category>update</category>
</item>
</channel>
</rss>

View File

@@ -1,140 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Your awesome title</title>
<meta name="viewport" content="width=device-width">
<meta name="description" content="Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.">
<link rel="canonical" href="http://yourdomain.com/">
<!-- Custom CSS -->
<link rel="stylesheet" href="/css/stylesheets/main.css">
</head>
<body>
<header class="site-header">
<div class="wrap">
<a class="site-title" href="/">Your awesome title</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
<path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="/about/">About</a>
</div>
</nav>
</div>
</header>
<div class="page-content">
<div class="wrap">
<div class="home">
<h1>Posts</h1>
<ul class="posts">
<li>
<span class="post-date">Jul 23, 2014</span>
<a class="post-link" href="/jekyll/update/2014/07/23/welcome-to-jekyll/">Welcome to Jekyll!</a>
</li>
</ul>
<p class="rss-subscribe">subscribe <a href="/feed.xml">via RSS</a></p>
</div>
</div>
</div>
<footer class="site-footer">
<div class="wrap">
<h2 class="footer-heading">Your awesome title</h2>
<div class="footer-col-1 column">
<ul>
<li>Your awesome title</li>
<li><a href="mailto:your-email@domain.com">your-email@domain.com</a></li>
</ul>
</div>
<div class="footer-col-2 column">
<ul>
<li>
<a href="https://github.com/jekyll">
<span class="icon github">
<svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
<span class="username">jekyll</span>
</a>
</li>
<li>
<a href="https://twitter.com/jekyllrb">
<span class="icon twitter">
<svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
</svg>
</span>
<span class="username">jekyllrb</span>
</a>
</li>
</ul>
</div>
<div class="footer-col-3 column">
<p class="text">Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</p>
</div>
</div>
</footer>
</body>
</html>

View File

@@ -1,148 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Welcome to Jekyll!</title>
<meta name="viewport" content="width=device-width">
<meta name="description" content="Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.">
<link rel="canonical" href="http://yourdomain.com/jekyll/update/2014/07/23/welcome-to-jekyll/">
<!-- Custom CSS -->
<link rel="stylesheet" href="/css/stylesheets/main.css">
</head>
<body>
<header class="site-header">
<div class="wrap">
<a class="site-title" href="/">Your awesome title</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 18 15" enable-background="new 0 0 18 15" xml:space="preserve">
<path fill="#505050" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0
h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#505050" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484
h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#505050" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0
c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="/about/">About</a>
</div>
</nav>
</div>
</header>
<div class="page-content">
<div class="wrap">
<div class="post">
<header class="post-header">
<h1>Welcome to Jekyll!</h1>
<p class="meta">Jul 23, 2014</p>
</header>
<article class="post-content">
<p>Youll find this post in your <code>_posts</code> directory - edit this post and re-build (or run with the <code>-w</code> switch) to see your changes!
To add new posts, simply add a file in the <code>_posts</code> directory that follows the convention: YYYY-MM-DD-name-of-post.ext.</p>
<p>Jekyll also offers powerful support for code snippets:</p>
<div class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">&quot;Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">&#39;Tom&#39;</span><span class="p">)</span>
<span class="c1">#=&gt; prints &#39;Hi, Tom&#39; to STDOUT.</span></code></pre></div>
<p>Check out the <a href="http://jekyllrb.com">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekylls GitHub repo</a>.</p>
</article>
</div>
</div>
</div>
<footer class="site-footer">
<div class="wrap">
<h2 class="footer-heading">Your awesome title</h2>
<div class="footer-col-1 column">
<ul>
<li>Your awesome title</li>
<li><a href="mailto:your-email@domain.com">your-email@domain.com</a></li>
</ul>
</div>
<div class="footer-col-2 column">
<ul>
<li>
<a href="https://github.com/jekyll">
<span class="icon github">
<svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761
c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32
c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472
c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037
C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65
c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261
c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082
c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129
c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
<span class="username">jekyll</span>
</a>
</li>
<li>
<a href="https://twitter.com/jekyllrb">
<span class="icon twitter">
<svg version="1.1" class="twitter-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill="#C2C2C2" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27
c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767
c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206
C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271
c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469
c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
</svg>
</span>
<span class="username">jekyllrb</span>
</a>
</li>
</ul>
</div>
<div class="footer-col-3 column">
<p class="text">Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</p>
</div>
</div>
</footer>
</body>
</html>

View File

@@ -1,11 +0,0 @@
---
layout: page
title: About
permalink: /about/
---
This is the base Jekyll theme. You can find out more info about customizing your Jekyll theme, as well as basic Jekyll usage documentation at [jekyllrb.com](http://jekyllrb.com/)
You can find the source code for the Jekyll new theme at: [github.com/jglovier/jekyll-new](https://github.com/jglovier/jekyll-new)
You can find the source code for Jekyll at [github.com/jekyll/jekyll](https://github.com/jekyll/jekyll)

Some files were not shown because too many files have changed in this diff Show More