jekyll-theme-recipe 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11713bc86ca101f2228b407fd592975fa5926e766dbb9be19fc63a2b3a46c7e6
4
- data.tar.gz: f1ea38779d1b54ceeb6d27dd78c12dd5488e78a79a5c3dee1bea2bee083e19cb
3
+ metadata.gz: f78ad054876a97b80c8da595795addc7e0263a422af1ca1daec4913d5d2ef85e
4
+ data.tar.gz: 48c9f6440e2f408d0149b16101e8fae26d0f5361fc2e4ce1c0e2fa1d6fd4e27d
5
5
  SHA512:
6
- metadata.gz: 99c66e784a0d85c680800e0132a588a581d212ff9d26a01014e2ec101af9052c9ea439e78479a076c0a6717c4476f08065442bfebfef3b3de60a9c17f75f38da
7
- data.tar.gz: 8707fca4b4b6af2cfa972ed7f69a949a55dcfbf8d3d2c125efe85e06344149846777169854b544e9d2a46720b3cb2b8cb15cc57ece7be36dc8d1e7c00ec386ed
6
+ metadata.gz: 66d7985a79821429163542003537e7971bfc694875d3ffec7fd701c0c9e8c4eb0f5da1eaa9ed84f5ee5c7efa12887e3597b75e6302508c67e5b5e9a8d4df241f
7
+ data.tar.gz: b0103ce7f6562fa89496bb12bececd4e90d8eba21bdaa693da1c541493cf66b8850f9151a36ef9333183c305f06024a01d9822ef490fd1d521902f90c8a34373
data/_layouts/post.html CHANGED
@@ -69,4 +69,4 @@ layout: default
69
69
  {% endif %}
70
70
  </article>
71
71
 
72
- <script type="text/javascript" src="{{ site.baseurl }}/assets/js/servings.js"></script>
72
+ <script type="text/javascript" src="{{ site.baseurl }}/assets/js/servings.js" defer></script>
@@ -1,62 +1,106 @@
1
- const portionElements = document.querySelectorAll('tr > td:first-child');
1
+ class Ingredient {
2
+ constructor(referenceValue, reference){
3
+ this.referenceValue = this.getDecimalValue(referenceValue);
4
+ this.reference = reference;
5
+ }
2
6
 
3
- const portionInput = document.querySelector('input#servings_number');
4
- var currentPortion = portionInput.value;
5
- portionInput.addEventListener("change", calculateServings);
7
+ getServingsValue(newServing, oldServing){
8
+ if(isNaN(this.referenceValue)){
9
+ return null;
10
+ }
6
11
 
7
- function calculateServings(){
8
- const newPortion = portionInput.value;
12
+ return this.referenceValue * newServing / oldServing;
13
+ }
9
14
 
10
- for (var i = 0; i < portionElements.length; i++) {
11
- if(portionElements[i].innerHTML == "&nbsp;"){ // "&nbsp;" == empty space
12
- continue; // no portion specified
15
+ calcAndRenderNewServingsValue(newServing, oldServing){
16
+ const newServingsValue = this.trimValue(this.getServingsValue(newServing, oldServing));
17
+
18
+ if(newServingsValue != null){
19
+ this.reference.innerHTML = newServingsValue.toString().includes(".")
20
+ ? this.decimalToFraction(newServingsValue)
21
+ : newServingsValue;
13
22
  }
14
-
15
- const portionElementValue = portionElements[i].innerHTML.search('/') >=0
16
- ? fractionToDecimal(portionElements[i].innerHTML)
17
- : Number.parseFloat(portionElements[i].innerHTML);
18
-
19
- const newPortionValue = trimNumberAfterDecimalPoint(portionElementValue * newPortion / currentPortion, 3);
20
-
21
- const newPortionString = newPortionValue.toString();
22
- portionElements[i].innerHTML = newPortionString.includes('.')
23
- ? decimalToFraction(newPortionString)
24
- : newPortionString;
25
23
  }
26
24
 
27
- currentPortion = newPortion;
28
- }
25
+ // "45 1/3" -> "45" (level of precision hinders understanding)
26
+ trimValue(servingsValue){
27
+ if(this.referenceValue >= 10){
28
+ return servingsValue.toFixed(0);
29
+ }
30
+ return servingsValue;
31
+ }
29
32
 
30
- // from: http://jsfiddle.net/5QrhQ/5/ or https://stackoverflow.com/a/23575406
31
- function decimalToFraction(decimal){
32
- var len = decimal.toString().length - 2;
33
-
34
- var denominator = Math.pow(10, len);
35
- var numerator = decimal * denominator;
33
+ toString(){
34
+ return "value: " + this.referenceValue + ", reference html: " + this.reference.innerHTML;
35
+ }
36
+
37
+ // from: http://jsfiddle.net/5QrhQ/5/ or https://stackoverflow.com/a/23575406
38
+ decimalToFraction(decimal){
39
+ var len = decimal.toString().length - 2;
40
+
41
+ var denominator = Math.pow(10, len);
42
+ var numerator = decimal * denominator;
43
+
44
+ var divisor = this.gcd(numerator, denominator);
45
+
46
+ numerator /= divisor;
47
+ denominator /= divisor;
48
+
49
+ return numerator > denominator
50
+ ? Math.floor(numerator / denominator) + " " + numerator % denominator + '/' + Math.floor(denominator)
51
+ : Math.floor(numerator) + '/' + Math.floor(denominator);
52
+ }
53
+ gcd(a, b) {
54
+ if (b < 0.0000001) return a; // Since there is a limited precision we need to limit the value.
36
55
 
37
- var divisor = gcd(numerator, denominator);
56
+ return this.gcd(b, Math.floor(a % b)); // Discard any fractions due to limitations in precision.
57
+ };
58
+ getDecimalValue(value){
59
+ return value.includes("/")
60
+ ? this.fractionToDecimal(value)
61
+ : Number.parseFloat(value);
62
+ }
63
+ // from https://stackoverflow.com/a/49246271
64
+ fractionToDecimal(fraction) {
65
+ const actualFraction = this.expandedFractionToSimple(fraction);
38
66
 
39
- numerator /= divisor;
40
- denominator /= divisor;
67
+ return actualFraction
68
+ .split('/')
69
+ .reduce((numerator, denominator, i) =>
70
+ numerator / (i ? denominator : 1)
71
+ );
72
+ }
73
+ expandedFractionToSimple(fraction){
74
+ if(fraction.includes(" ")){
75
+ factorSplit = fraction.split(" ");
76
+ factor = factorSplit[0];
77
+
78
+ fractionSplit = factorSplit[1].split("/");
79
+ numerator = fractionSplit[0];
80
+ denominator = fractionSplit[1];
81
+
82
+ return ((Number.parseInt(factor) * Number.parseInt(denominator)) + Number.parseInt(numerator)) + "/" + Number.parseInt(denominator);
83
+ }
84
+ return fraction;
85
+ }
41
86
 
42
- return Math.floor(numerator) + '/' + Math.floor(denominator);
43
- }
44
- function gcd(a, b) {
45
- if (b < 0.0000001) return a; // Since there is a limited precision we need to limit the value.
46
-
47
- return gcd(b, Math.floor(a % b)); // Discard any fractions due to limitations in precision.
48
- };
49
-
50
-
51
- // from https://stackoverflow.com/a/49246271
52
- function fractionToDecimal(fraction) {
53
- return fraction
54
- .split('/')
55
- .reduce((numerator, denominator, i) =>
56
- numerator / (i ? denominator : 1)
57
- );
58
87
  }
59
88
 
60
- function trimNumberAfterDecimalPoint(number, decimals){
61
- return Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);
89
+ let ingredients = [];
90
+ // create a Ingredient Element for every HTML ELement
91
+ const ingredientHTMLElements = document.querySelectorAll('tr > td:first-child');
92
+ ingredientHTMLElements.forEach((ingredient) => ingredients.push(new Ingredient(ingredient.innerHTML, ingredient)));
93
+
94
+
95
+ const servingsInput = document.querySelector('input#servings_number');
96
+ var referenceServings = servingsInput.value;
97
+
98
+ /// react to servings input
99
+ servingsInput.addEventListener("change", calculateServings);
100
+ function calculateServings(){
101
+ const newPortion = servingsInput.value;
102
+
103
+ for (var i = 0; i < ingredients.length; i++) {
104
+ ingredients[i].calcAndRenderNewServingsValue(newPortion, referenceServings);
105
+ }
62
106
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-theme-recipe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hanno Witzleb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-23 00:00:00.000000000 Z
11
+ date: 2023-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  - !ruby/object:Gem::Version
185
185
  version: '0'
186
186
  requirements: []
187
- rubygems_version: 3.3.26
187
+ rubygems_version: 3.4.6
188
188
  signing_key:
189
189
  specification_version: 4
190
190
  summary: Recipe is a Jekyll theme for recipe websites, and adapted from CloudCannons