mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-20 11:20:41 -07:00
Top Hat changes
This commit is contained in:
@@ -8,6 +8,7 @@ end
|
|||||||
gemspec
|
gemspec
|
||||||
|
|
||||||
gem "base64"
|
gem "base64"
|
||||||
|
gem "webrick"
|
||||||
|
|
||||||
group :benchmark, :test do
|
group :benchmark, :test do
|
||||||
gem 'benchmark-ips'
|
gem 'benchmark-ips'
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ end
|
|||||||
|
|
||||||
class Servlet < LiquidServlet
|
class Servlet < LiquidServlet
|
||||||
def index
|
def index
|
||||||
{ 'date' => Time.now }
|
{ 'date' => Time.now, 'products' => products_list }
|
||||||
end
|
end
|
||||||
|
|
||||||
def products
|
def products
|
||||||
@@ -29,11 +29,42 @@ class Servlet < LiquidServlet
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
class Name < Liquid::Drop
|
||||||
|
attr_reader :raw, :origin
|
||||||
|
|
||||||
|
def initialize(raw, origin)
|
||||||
|
super()
|
||||||
|
@raw = raw
|
||||||
|
@origin = origin
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Price < Liquid::Drop
|
||||||
|
attr_reader :value, :unit
|
||||||
|
|
||||||
|
def initialize(value, unit = 'USD')
|
||||||
|
super()
|
||||||
|
@value = value
|
||||||
|
@unit = unit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Product < Liquid::Drop
|
||||||
|
attr_reader :name, :price, :description
|
||||||
|
|
||||||
|
def initialize(name, origin, price, description)
|
||||||
|
super()
|
||||||
|
@name = Name.new(name, origin)
|
||||||
|
@price = Price.new(price)
|
||||||
|
@description = description
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def products_list
|
def products_list
|
||||||
[
|
[
|
||||||
{ 'name' => 'Arbor Draft', 'price' => 39900, 'description' => 'the *arbor draft* is a excellent product' },
|
{ 'name' => 'Alpine jacket', 'price' => { 'value' => 30000, 'unit' => 'USD' }, 'description' => 'the *alpine jacket* is a excellent product' },
|
||||||
{ 'name' => 'Arbor Element', 'price' => 40000, 'description' => 'the *arbor element* rocks for freestyling' },
|
{ 'name' => 'Mountain boots', 'price' => { 'value' => 40000, 'unit' => 'BRL' }, 'description' => 'the *mountain boots* are perfect for hiking' },
|
||||||
{ 'name' => 'Arbor Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity' }
|
{ 'name' => 'Safety helmet', 'price' => { 'value' => 10000, 'unit' => 'USD' }, 'description' => 'the *safety helmet* provides essential protection for winter sports' }
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,71 @@
|
|||||||
<p>Hello world!</p>
|
{% # theme-check-disable UnknownFilter, UndefinedObject %}
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Liquid filters playground</title>
|
||||||
|
<script>
|
||||||
|
setInterval(() => {
|
||||||
|
fetch(window.location.href)
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(html => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const newDoc = parser.parseFromString(html, 'text/html');
|
||||||
|
const newBody = newDoc.body;
|
||||||
|
document.body.innerHTML = newBody.innerHTML;
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error updating content:', error));
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
zoom: 2;
|
||||||
|
font-family: monospace
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
<p>It is {{date}}</p>
|
<h1>
|
||||||
|
Liquid filters playground
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
{{ products | map: "name" | json }}
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
find
|
||||||
|
</h2>
|
||||||
|
<pre>
|
||||||
|
{% assign product = products | find: "name", "Mountain boots" %}
|
||||||
|
{{ product.name }} - {{ product.price.value }}
|
||||||
|
|
||||||
|
{% assign product = products | find: "price.unit", "USD" %}
|
||||||
|
{{ product.name }} - {{ product.price.value }}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
find_index
|
||||||
|
</h2>
|
||||||
|
<pre>
|
||||||
|
{% assign index = products | find_index: "name", "Mountain boots" %}
|
||||||
|
{{ index }}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
has
|
||||||
|
</h2>
|
||||||
|
<pre>
|
||||||
|
{{ products | has: "name", "Mountain boots" }}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<p>Check out the <a href="/products">Products</a> screen </p>
|
<h2>
|
||||||
|
reject
|
||||||
|
</h2>
|
||||||
|
<pre>
|
||||||
|
{{ products | map: "name" | join: ", " }}
|
||||||
|
{{ products | reject: "name", "Mountain boots" | map: "name" | join: ", " }}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user