jekyll-theme-recipe 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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