<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Nunjucks and Chartjs &#x2F; Javascript]]></title><description><![CDATA[<p dir="auto">Can anyone help me placing a chartjs graph in a nunjucks template?</p>
<p dir="auto">Using the usual JS  it was problem for me.<br />
I would use the getDom method and create the relevant divs and a canvas and later on place the chart using the described chart.js method which looks like this:</p>
<pre><code>var myChart = new Chart(context, { options })
</code></pre>
<p dir="auto">With a Nunjucks template I have my problems.<br />
I had an empty canvas element in the template and tried to draw a graph in the JS part but it disappears after a very short time again. I have the suspicion the canvas gets “overwritten” by template updates.</p>
<p dir="auto">Then I tried to create the canvas element itself on foot (document.createElement) in the function that creates the graph but it turns out that apparently the containing div is not even created. At least by calling document.getElementById inside the function I get “null”</p>
<p dir="auto">When does Nunjucks create the document objects?<br />
And if it does, does it overwrite any nodes created using a javascript function?</p>
<p dir="auto">If I am reliant on Javascript to create a document object (like here), do I need to stuff this into a filter or is there another way to manipulate the DOM?</p>
<p dir="auto">Hope my problem is comprehensible.</p>
<p dir="auto">Thanks!</p>
]]></description><link>https://forum.magicmirror.builders/topic/11234/nunjucks-and-chartjs-javascript</link><generator>RSS for Node</generator><lastBuildDate>Wed, 13 May 2026 13:33:49 GMT</lastBuildDate><atom:link href="https://forum.magicmirror.builders/topic/11234.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 Sep 2019 13:54:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 18 Nov 2019 14:33:57 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> updateDom() returns a promise, but then IMMEDIATELY calls getDom()…</p>
<p dir="auto">so the wait is ineffective</p>
<p dir="auto">all you can do is check the dom to see if your minimum content some anchoring div) is present, and retry that until it is.<br />
then call updateDom() to force a refresh</p>
<p dir="auto">this is what I do in getDom(). i have an array of different charts to present</p>
<pre><code>		// if we are not suspended/hidden due to sleep or whatever
		if (wself.suspended == false) {
			// make sure we don't start before the data gets here
			if (!this.loaded) {    &lt; -  just a flag for first time
				this.loaded = true;
				return wself.wrapper;
			} else {
				// loop thru the data from the blynk server, one chart per data point/pin
				for (var pin_index = 0; pin_index &lt; wself.config.Pins.length; pin_index++) {
					// get the pin text name. used for index into the data hash
					var this_pin = wself.config.Pins[pin_index];
					// clear the work variable
					var canvas = null;
					// try to locate the existing chart
					if ((canvas = document.getElementById("myChart" + this_pin)) == null) {
						var c = document.createElement("div");
						c.style.width = wself.config.width + "px";
						c.style.height = wself.config.height + "px";
						if (!wself.config.stacked)
						     {c.style.display = "inline-block";}
						wself.wrapper.appendChild(c);

						canvas = document.createElement("canvas");
						canvas.id = "myChart" + this_pin;
						c.appendChild(canvas);
					}
					// if the chart has been created
					if (wself.charts[pin_index] != null) {
						// destroy it, update doesn't work reliably
						wself.charts[pin_index].destroy();
						// make it unreferenced
						wself.charts[pin_index] = 0;
					}
					// create it now, into the special div object for this chart
					wself.charts[pin_index] = new Chart(canvas, {
</code></pre>
<p dir="auto">my ‘schedule update’ asks for more data from my node_helper…<br />
it informs me when its back. and I call updateDom() after saving the data where getDom() will look</p>
<p dir="auto">u can see my code at <a href="https://github.com/sdetweil/WaterLevels" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/sdetweil/WaterLevels</a></p>
]]></description><link>https://forum.magicmirror.builders/post/64663</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/64663</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Mon, 18 Nov 2019 14:33:57 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 18 Nov 2019 13:08:05 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a> Sam, sorry to say that after such a long time I’m still not through with this.<br />
Promises make my head explode, so I hope you can help me.</p>
<pre><code>    scheduleUpdates: function() {
      var self = this;

      setInterval(function() {
        var conf = self.config;
        self.updateDom(conf.animationSpeed);

        setTimeout(function() {
          self.createBarChart();
        }, 2000);
      }, this.config.updateInterval);
    },
</code></pre>
<p dir="auto">This is an easified version of my loop to update the dom.<br />
You can see the timeout function I have built in to wait 2 seconds and be sure the dom has been created. Then in the createBarChart function I can write the chart into the dom.<br />
This works, but I don’t like it at all.<br />
Isn’t there a way to “await” the resolved promise from outside of the updateDom function? After all updateDom() returns a promise.<br />
I have tried to do <code>self.updateDom().then( function() {self.createBarChart() });</code><br />
It didn’t work.</p>
<p dir="auto">Thanks for your support. Really appreciated.</p>
]]></description><link>https://forum.magicmirror.builders/post/64652</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/64652</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Mon, 18 Nov 2019 13:08:05 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 30 Sep 2019 22:31:49 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> both your 1 and 2 are processed as async, just 1 is done  when getDom() returns a dom object tree.<br />
main.js</p>
<p dir="auto">updateDom() calls getDom() immediately. and then checks what it gets back.</p>
<p dir="auto">either a promise (generated content will return later) or dom objects (all done generating)<br />
if content, then it creates a promise and resolves it immediately with the data<br />
(something will wait on the promise eventually)</p>
<p dir="auto">now we have a promise, so can wait (.then), get the data (either approach), and then inject it into the dom.(updateDomWithContent)<br />
(via a promise, as it may take a while to do that update, don’t want to block everybody else)<br />
and then call back whoever called updateDom()</p>
<pre><code>var updateDom = function(module, speed) {
		return new Promise(function(resolve) {
			var newContentPromise = module.getDom();
			var newHeader = module.getHeader();

			if (!(newContentPromise instanceof Promise)) {
				// convert to a promise if not already one to avoid if/else's everywhere
				newContentPromise = Promise.resolve(newContentPromise);
			}

			newContentPromise.then(function(newContent) {
				var updatePromise = updateDomWithContent(module, speed, newHeader, newContent);

				updatePromise.then(resolve).catch(Log.error);
			}).catch(Log.error);
		});
	};
</code></pre>
]]></description><link>https://forum.magicmirror.builders/post/61932</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61932</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Mon, 30 Sep 2019 22:31:49 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 30 Sep 2019 22:11:15 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a><br />
Well…I have to say I’m not through with this.</p>
<p dir="auto">getDom creates/updates the module-specific dom objects. Right?<br />
So let’s say there’s two ways to have a canvas:</p>
<ol>
<li>document.createElement in an overwritten getDom method</li>
<li>Nunjucks template, which is being converted into HTML during getDom.</li>
</ol>
<p dir="auto">The Nunjucks way seems asynchronous, overwriting the getDom however makes it synchronous and has the advantage of “immediate full control”. You can then code your graph directly into the getdom method (like you have done as far as I understand). All good, but does not work with Nunjucks without messing with several layers  of core MM code.</p>
<p dir="auto">OR you can use another process (like socketNotification from Node_helper) to do</p>
<ol>
<li>getCanvasById and</li>
<li>write the graph into it.<br />
That should work with both options, the async nunjucks and the overwritten getDom, since it is on a completely different chain of commands.</li>
</ol>
<p dir="auto">That didn’t work for me with Nunjucks, because it seems to do rewrite more often than just with getDom. I remember that someone on this forum had the same assumption.</p>
<p dir="auto">Thanks for the intersting discussion. Learned a lot and will try out a bit more.</p>
]]></description><link>https://forum.magicmirror.builders/post/61931</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61931</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Mon, 30 Sep 2019 22:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 30 Sep 2019 16:52:56 GMT]]></title><description><![CDATA[<p dir="auto">the dom looks like this before any content is output  (no &lt; &gt; to save errors)<br />
matching index.html, with a div for each module, in its position div section<br />
in fifo order</p>
<pre><code>head
body
    div class=fullscreen below"
        div id="module_id_1" 
            div class="module-header"
            end-div
            div class="module-content"
            end div
        end-div
        div id="module_id_2"
        end-div
   div class="region top bar"
      div class="container",
          end-div
      		div class="region top left" 
                    div class="container"
                    end-div
                end-div
                   etc
      	&lt;/div&gt;
</code></pre>
<p dir="auto">then getDom() in each module is called, and its little html contribution is placed in its div id=“module-content” (by module_id)</p>
<p dir="auto">but, until the dom.div.addChild(content) is done, the content is just in memory, NOT IN the dom…</p>
<p dir="auto">then later the module signals the mirror runtime via updateDom()… ‘I have new content’,<br />
and MM runtime calls the module’s getDom() and we repeat the process… note in the updateModule content<br />
it REMOVES the prior content and injects the new…</p>
<pre><code>                contentWrapper[0].innerHTML = "";  // &lt; --- clear all content, the rough way
		contentWrapper[0].appendChild(newContent);  // &lt; --- append the new module content tree
</code></pre>
<p dir="auto">SO, BIG dom object tree cleanup and rebuild…</p>
<p dir="auto">i keep the module contribution, and modify it where appropriate, to reduce the change impact.</p>
<p dir="auto">I always think the getDom() should be named getDomContribution()</p>
]]></description><link>https://forum.magicmirror.builders/post/61921</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61921</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Mon, 30 Sep 2019 16:52:56 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 30 Sep 2019 15:46:54 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> said in <a href="/post/61919">Nunjucks and Chartjs / Javascript</a>:</p>
<blockquote>
<p dir="auto">I tried to meddle with the getdom function, which does not work because the returned module div is appended to a parent node somewhere else in the MM code hierarchy. And only then I can refer to the DOM elements. (I guess that’s what you meant and I haven’t understood).</p>
</blockquote>
<p dir="auto">main.js</p>
<pre><code>	var updateModuleContent = function(module, newHeader, newContent) {
		var moduleWrapper = document.getElementById(module.identifier);
        if (moduleWrapper === null) return;
		var headerWrapper = moduleWrapper.getElementsByClassName("module-header");
		var contentWrapper = moduleWrapper.getElementsByClassName("module-content");

		contentWrapper[0].innerHTML = "";
		contentWrapper[0].appendChild(newContent);

		if( headerWrapper.length &gt; 0 &amp;&amp; newHeader) {
			headerWrapper[0].innerHTML = newHeader;
		}
	};
</code></pre>
<p dir="auto">takes the content returned from getDom() and inserts it into the div created by module_id in the dom tree in the ‘position’ specified.</p>
<p dir="auto">in my code that is why i create the div ‘canvas’. I have the div object, in getDom, and can generate the content immediately… no timer waiting to look it up later</p>
<pre><code>            canvas = document.createElement("canvas");    // &lt; ---
            canvas.id = "myChart" + this_pin;
            c.appendChild(canvas);                                           // &lt; ---
          }
          // if the chart has been created
          if (wLself.charts[pin_index] != null) {
              // destroy it, update doesn't work reliably
              wLself.charts[pin_index].destroy();
              // make it unreferenced
              wLself.charts[pin_index] = 0;
          }
					try { 
						// create it now
						wLself.charts[pin_index] = new Chart(canvas, {   // &lt; ---
</code></pre>
<p dir="auto">then getDom() returns the completed chart… no need for build later</p>
]]></description><link>https://forum.magicmirror.builders/post/61920</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61920</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Mon, 30 Sep 2019 15:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Mon, 30 Sep 2019 15:29:41 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a><br />
Sam, thanks again for your valuable contribution.<br />
I tried to meddle with the getdom function, which does not work because the returned module div is appended to a parent node somewhere else in the MM code hierarchy. And only then I can refer to the DOM elements. (I guess that’s what you meant and I haven’t understood).</p>
<p dir="auto">So, although I didn’t like it, I kind of did it your way and included a 3-second setTimeout() call directly after the updateDom() call, in which I called my chart function.</p>
<pre><code>                    self.updateDom(self.config.animationSpeed);
                    setTimeout (function() {
                      self.createBarChart(...);
                    }, 3000);

</code></pre>
<p dir="auto">It works now.<br />
I still don’t like it. :-)<br />
But I want to move on.</p>
]]></description><link>https://forum.magicmirror.builders/post/61919</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61919</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Mon, 30 Sep 2019 15:29:41 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 17:11:13 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> the dom is created  way back at the beginning when u receved the DOM_OBJECTS_CREATED notification…  so, when your module is called later, the DOM exists… document. exists</p>
<p dir="auto">YOUR contribution to the dom may not be there for some time after your getDom() routine returns. MM does not specify how long…</p>
<p dir="auto">if I need to fiddle with the dom directly, I usually do that thru a time routine, set for 1-2 seconds after getdom returns.</p>
]]></description><link>https://forum.magicmirror.builders/post/61770</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61770</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Fri, 27 Sep 2019 17:11:13 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 15:17:07 GMT]]></title><description><![CDATA[<p dir="auto">Wait. There is an asynch function in the getdom function, isn’t there? So calling my function directly afterwards may lead to a state where the dom is not yet created. Hmm…</p>
]]></description><link>https://forum.magicmirror.builders/post/61766</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61766</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Fri, 27 Sep 2019 15:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 15:08:52 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a> fully understood and agree.<br />
Thinking about replacing getdom with the native one and somehow implementing my chart function but there has to be a simpler way.</p>
<p dir="auto">After all getdom is the only function replacing the dom, in my case loading the template, isn’t it?. So there must be a way to manipulate the dom directly after it has been created.</p>
]]></description><link>https://forum.magicmirror.builders/post/61765</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61765</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Fri, 27 Sep 2019 15:08:52 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 14:55:03 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> note… if you have the functions getDom, and getTemplate and getTemplateData<br />
then the core methods will NOT be called.</p>
<p dir="auto">i think IF you have getDom , then unless YOU call them , getTemplate and getTemplateData will NOT be called.  (because u replaced the built in getDom() with your own version)</p>
<p dir="auto">getTemplate and getTemplateData are ONLY called from the default getDom</p>
<p dir="auto">I confirmed this in one of my modules that uses getDom()… I added the template methods, and logged when they were called…</p>
<pre><code>getTemplate: function() {
	Log.log("in getTemplate");
	return "";
},
getTemplateData: function (){
	Log.log("in getTemplateData");
	return "";
}
</code></pre>
<p dir="auto">they were not called</p>
]]></description><link>https://forum.magicmirror.builders/post/61764</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61764</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Fri, 27 Sep 2019 14:55:03 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 14:37:00 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a> said in <a href="/post/61760">Nunjucks and Chartjs / Javascript</a>:</p>
<blockquote>
<p dir="auto">its either template OR dom,  not both.<br />
/* getDom()</p>
<ul>
<li>This method generates the dom which needs to be displayed. This method is called by the Magic Mirror core.</li>
<li>This method can to be subclassed if the module wants to display info on the mirror.</li>
<li>Alternatively, the getTemplate method could be subclassed.</li>
</ul>
</blockquote>
<p dir="auto">I understand this differently from the core code.<br />
From what I see getDom is the parent function and getTemplate fills this with html code from a template. So in a module using nunjucks you could call getDom AND getTemplate separately.<br />
And manipulate the dom after the template is loaded.<br />
But that is something I fail to do…</p>
]]></description><link>https://forum.magicmirror.builders/post/61763</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61763</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Fri, 27 Sep 2019 14:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 14:26:17 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sdetweil" aria-label="Profile: sdetweil">@<bdi>sdetweil</bdi></a></p>
<p dir="auto">Thanks Sam.<br />
I have built a module with chart.js as well, no problme with that, however this time I am kind of dependant on nunjucks because I had forked a project and do not want to rebuild everything.</p>
<p dir="auto">But thanks for pointing me to the core code. I always forget to have a look into that.</p>
]]></description><link>https://forum.magicmirror.builders/post/61762</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61762</guid><dc:creator><![CDATA[lavolp3]]></dc:creator><pubDate>Fri, 27 Sep 2019 14:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Nunjucks and Chartjs &#x2F; Javascript on Fri, 27 Sep 2019 14:25:07 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/lavolp3" aria-label="Profile: lavolp3">@<bdi>lavolp3</bdi></a> according to the code in app/js/module.js</p>
<p dir="auto">its either template OR dom,  not both.</p>
<pre><code>	/* getDom()
	 * This method generates the dom which needs to be displayed. This method is called by the Magic Mirror core.
	 * This method can to be subclassed if the module wants to display info on the mirror.
	 * Alternatively, the getTemplate method could be subclassed.
</code></pre>
<p dir="auto">using Chart.js in my module I do</p>
<pre><code>   				position: 'top_right',
</code></pre>
<p dir="auto">in config, so that is the base location<br />
then</p>
<p dir="auto">create the canvas div, and then the chart in the canvas (I could have multiple charts to draw, from an array of data)</p>
<pre><code>					var this_pin = wself.config.Pins[pin_index];
					// clear the work variable
					var canvas = null;
					// try to locate the existing chart
					if ((canvas = document.getElementById("myChart" + this_pin)) == null) {
						var c = document.createElement("div");
						c.style.width = wself.config.width + "px";
						c.style.height = wself.config.height + "px";
						if (!wself.config.stacked)
						{c.style.display = "inline-block";}
						wself.wrapper.appendChild(c);

						canvas = document.createElement("canvas");
						canvas.id = "myChart" + this_pin;
						c.appendChild(canvas);
					}
					// if the chart has been created
					if (wself.charts[pin_index] != null) {
						// destroy it, update doesn't work reliably
						wself.charts[pin_index].destroy();
						// make it unreferenced
						wself.charts[pin_index] = 0;
					}
					// create it now
					wself.charts[pin_index] = new Chart(canvas, {
						type: "line",
						showLine: true,
						data: {
...
            // then return the outer container div 
		return wself.wrapper;
</code></pre>
<p dir="auto">U could download my module and look at it<br />
<a href="https://github.com/sdetweil/WaterLevels" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/sdetweil/WaterLevels</a></p>
<p dir="auto">so, in the end I have</p>
<pre><code>wrapper  (div)
     div (chart 1)
       chart canvas
     div (chart 2)
       chart canvas
     ...
     div (chart n)
       chart canvas
</code></pre>
<p dir="auto">I have never used templates for anything… (I have enough trouble with normal code)</p>
]]></description><link>https://forum.magicmirror.builders/post/61760</link><guid isPermaLink="true">https://forum.magicmirror.builders/post/61760</guid><dc:creator><![CDATA[sdetweil]]></dc:creator><pubDate>Fri, 27 Sep 2019 14:25:07 GMT</pubDate></item></channel></rss>