Transform Jekyll "reading time" into "page rating calculation" - ruby

I want to transform following Jekyll "reading time" calculator
<span class="reading-time">
{% capture words %}
{{ content | number_of_words | minus: 180 }}
{% endcapture %}
{% unless words contains “-” %}
{{ words | plus: 180 | divided_by: 180 |
append: “minutes to read” }}
{% endunless %}
</span>
into "page rating" with the following meta taken from page Front matter using following formula
{{ page.facebook }}
plus
{{ page.instagram }}
multiply
{{ page.age }}
divide
1000 000
multiply {{ content | number_of_words }}
divide
100 =
More details here

This can do the trick :
{% assign number_of_words = content | strip_html | number_of_words %}
{% assign social = page.facebook | plus: page.instagram %}
{% comment %}Two lines for readability, but can be chained on one line{% endcomment %}
{% assign Indexmod = social | times: page.age | divided_by: 1000000.0 %}
{% assign Indexmod = Indexmod | times: number_of_words | divided_by: 100 %}
Note :
the use of strip_html, this avoid counting html as words.
the use of 'divided_by: 1000000.0' to cast result to a Float

Related

Shopify Theme - Discount percentage always at 0 (product page)

The discount percentage of my products is always equal to 0%
This problem occurred with the new store theme that I uploaded
Please check the joined image:
https://image.noelshack.com/fichiers/2019/30/1/1563820267-capture.png)
I have tried to check the code inside product-template.liquid file but didn't find anything wrong.
Here is the part of the code responsible for generating this discount
<span class="save_discount_pro">
{% if current_variant.compare_at_price > current_variant.price %}
{% if settings.show_discount_amount == 'percent_save' %}
<span class="per_discount">
{% comment %}
{% endcomment %}
{% assign money_pro_format = shop.money_format | strip_html | json %}
{% if money_pro_format contains "${{amount_no_decimals}}" or money_pro_format contains "${{amount_no_decimals_with_comma_separator}}" %}
{{ current_variant.compare_at_price | minus: current_variant.price | times: 100.0 | divided_by: current_variant.compare_at_price | times: 100 | money_without_currency | replace:",","." | replace: '.0', '' }}{{ 'products.product.on_save' | t }}
{% elsif money_pro_format contains "${{amount_with_comma_separator}}" %}
{{ current_variant.compare_at_price | minus: current_variant.price | times: 100.0 | divided_by: current_variant.compare_at_price | money_without_currency | replace:",","." | times: 100 | replace: '.0', '' }}{{ 'products.product.on_save' | t }}
{% else %}
{{ current_variant.compare_at_price | minus: current_variant.price | times: 100.0 | divided_by: current_variant.compare_at_price | money_without_currency | times: 100 | replace: '.0', ''}}{{ 'products.product.on_save' | t }}
{% endif %}
</span>
could detect anything wrong with the code?
Best regards,
It seems likely that in your Shopify admin, under 'Store Currency' (Settings->General->Store Currency->Change formatting), the values don't match the values in your code.
Do the values in your admin start with '$'? If so, could you omit them from your code. Eg. Instead of 'if money_pro_format contains "${{amount_no_decimals}}"', use 'if money_pro_format contains "{{amount_no_decimals}}"'

Jekyll page rating calculator with meta from Front Mater area

I am editing include/span with the following code pretend to be as "Jekyll page rating calculator with meta from Front Mater area" but it seems like some syntax missing an extra heading/lines to let calculation to display in left bottom round quotes. Now there is no value
See the sampl page
<span class="indexmod">
{% assign number_of_words = content | strip_html | number_of_words %}
{% assign social = page.facebook | plus: page.instagram %}
{% comment %}Two lines for readability, but can be chained on one line{%
endcomment %}
{% assign Indexmod = social | times: page.age | divided_by: 1000000.0 %}
{% assign Indexmod = Indexmod | times: number_of_words | divided_by: 100
%}
{% endunless %}
</span>
There are two reasons why this doesn't work:
The {% endunless %} in this include is missing a matching unless clause. Either add one or remove the endunless line.
The value of Indexmod is not printed. You can do that by adding {{ Indexmod }} after your calculations are done.

how do I concat page variables in jekyll loops

I'm accessing a page variable in a jekyll loop like below:
```ruby
{% assign kind = page.categories | first %}
{% for post in site.categories.[kind] | limit: 5 %}
{% unless post.url == page.url %}
<a href="{{ site.baseurl }}{{ post.url }}" class = 'post-url'>
<img src = '{{ site.baseurl }}/assets/{{ post.image }}.jpg>
<h2 itemprop="name headline">{{ page.title | escape }}</h2>
<time >{{ post.date | date: date_format }}</time>
</a>
{% endunless %}
{% endfor %}
```
Although the page builds successfully it outputs an error saying Expected page id but found open_square in "post in site.categories.[kind] | limit: 5"
How can I avoid this add still be able to use the page.categories | first variable?
Use site.categories[kind] instead of site.categories.[kind]
There shouldn't be any dot after "categories"

Jekyll custom date

I want use bellow code to display custom date in my Jekyll site
{% assign m = page.date | date: "%-m" %}
{% case m %}
{% when '1' %}Januar
{% when '2' %}Februar
{% when '3' %}März
{% when '4' %}April
{% when '5' %}Mai
{% when '6' %}Juni
{% when '7' %}Juli
{% when '8' %}August
{% when '9' %}September
{% when '10' %}Oktober
{% when '11' %}November
{% when '12' %}Dezember
{% endcase %}
But I don't now where to put it (I tried in post.html but does not work)
I've made a template for this.
This template translate a date in a specific language. Here it's french but feel free to change month and day arrays.
This template can be used in an enumeration of post/page (eg: the index page) or in a post/page template.
When used in an enumeration, you need to pass the date to process
{% for post in site.posts %}
<li>
<span class="post-date">{% include custom_date_full_fr.html date = post.date %}</span>
<a class="post-link" href="{{ post.url | prepend: site.baseurl }}">{{ post.title }}</a>
</li>
{% endfor %}
Where used in a page/post template, you just have to include the template, as the page.date will already be available.
{% include custom_date_full_fr.html %}
custom_date_full_fr.html
{% if include.date %}
{% assign processed_date = include.date %}
{% else if page.date %}
{% assign processed_date = page.date %}
{% endif %}
{% comment %}-------- Test if we have a date to process --------{% endcomment %}
{% if processed_date %}
{% assign month = "janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre" | split: "," %}
{% comment %}------ Note : sunday is the first day in this array -------{% endcomment %}
{% assign day = "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi" | split: "," %}
{% assign month_index = processed_date | date: "%m" | minus: 1 %}
{%comment%}----------------------------------------------
Here **minus: 0** is a trick to convert day_index from string to integer and then use it as an array index.
----------------------------------------------{%endcomment%}
{% assign day_index = processed_date | date: "%w" | minus: 0 %}
{%comment%}-------- Output the date ----------{%endcomment%}
{{ day[day_index] }} {{ processed_date | date: "%d" }} {{ month[month_index] }} {{ processed_date | date: "%Y" }}
{% endif %}
See here for more info :
Jekyll Date Formatting Examples by Alan W. Smith
Liquid documentation - date filters

how to pad a string in jekyll?

Say I'm incrementing an integer like this
{% capture page %}{{ page | plus: '1' }}{% endcapture %}
How could I pad it like this?
{% capture paddedPage %}{{ page | pad '0', 4 }}{% endcapture %}
where 4 is number of padding places, and '0' is the padding string? The end result would look like this: 0001 where the value of page is 1. How might I do this inline or in a filter?
I guess it could be represented like sprintf( '%d4', page ) but obviously this syntax does not work with liquid/jekyll.
I'm growing really disappointed in jekyll/liquid syntax (does not even have native modulus!) That aside, how might I pad a string with leading characters?
Use liquid filter prepend and slice, like this:
{{ page | prepend: '0000' | slice: -4, 4 }}
With Liquid you can do :
{% assign pad = 4 %}
{% assign padStr = '0' %}
{% assign numbers = "1|12|123|1234" | split: "|" %}
{% for number in numbers %}
{% assign strLength = number | size %}
{% assign padLength = pad | minus: strLength %}
{% if padLength > 0 %}
{% assign padded = number %}
{% for position in (1..padLength) %}
{% assign padded = padded | prepend: padStr %}
{% endfor %}
<p>{{ number}} padded to {{ padded }}</p>
{% else %}
<p>{{ number}} no padding needed</p>
{% endif %}
{% endfor %}
Note : Liquid modulus filter is {{ 12 | modulo: 5 }}

Resources