It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://www.rinjanisamalas.net/

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <link rel="icon" type="image/svg+xml" href="/vite.svg" />
  6. <meta name="generator" content="Hostinger Horizons" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  8. <title>Rinjani Samalas Tour - Mount Rinjani Trekking Packages</title>
  9. <meta name="description" content="Book the best Mount Rinjani trekking and hiking packages with Rinjani Samalas. Professional guides, stunning views, and an unforgettable adventure in Lombok await you." />
  10. <script type="module" crossorigin src="/assets/index-3955bb70.js"></script>
  11. <link rel="stylesheet" href="/assets/index-d1dbf693.css">
  12. <script type="module">
  13. window.onerror = (message, source, lineno, colno, errorObj) => {
  14. const errorDetails = errorObj ? JSON.stringify({
  15. name: errorObj.name,
  16. message: errorObj.message,
  17. stack: errorObj.stack,
  18. source,
  19. lineno,
  20. colno,
  21. }) : null;
  22.  
  23. window.parent.postMessage({
  24. type: 'horizons-runtime-error',
  25. message,
  26. error: errorDetails
  27. }, '*');
  28. };
  29. </script>
  30. <script type="module">
  31. const observer = new MutationObserver((mutations) => {
  32. for (const mutation of mutations) {
  33. for (const addedNode of mutation.addedNodes) {
  34. if (
  35. addedNode.nodeType === Node.ELEMENT_NODE &&
  36. (
  37. addedNode.tagName?.toLowerCase() === 'vite-error-overlay' ||
  38. addedNode.classList?.contains('backdrop')
  39. )
  40. ) {
  41. handleViteOverlay(addedNode);
  42. }
  43. }
  44. }
  45. });
  46.  
  47. observer.observe(document.documentElement, {
  48. childList: true,
  49. subtree: true
  50. });
  51.  
  52. function handleViteOverlay(node) {
  53. if (!node.shadowRoot) {
  54. return;
  55. }
  56.  
  57. const backdrop = node.shadowRoot.querySelector('.backdrop');
  58.  
  59. if (backdrop) {
  60. const overlayHtml = backdrop.outerHTML;
  61. const parser = new DOMParser();
  62. const doc = parser.parseFromString(overlayHtml, 'text/html');
  63. const messageBodyElement = doc.querySelector('.message-body');
  64. const fileElement = doc.querySelector('.file');
  65. const messageText = messageBodyElement ? messageBodyElement.textContent.trim() : '';
  66. const fileText = fileElement ? fileElement.textContent.trim() : '';
  67. const error = messageText + (fileText ? ' File:' + fileText : '');
  68.  
  69. window.parent.postMessage({
  70. type: 'horizons-vite-error',
  71. error,
  72. }, '*');
  73. }
  74. }
  75. </script>
  76. <script type="module">
  77. const originalConsoleError = console.error;
  78. console.error = function(...args) {
  79. originalConsoleError.apply(console, args);
  80.  
  81. let errorString = '';
  82.  
  83. for (let i = 0; i < args.length; i++) {
  84. const arg = args[i];
  85. if (arg instanceof Error) {
  86. errorString = arg.stack || `${arg.name}: ${arg.message}`;
  87. break;
  88. }
  89. }
  90.  
  91. if (!errorString) {
  92. errorString = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
  93. }
  94.  
  95. window.parent.postMessage({
  96. type: 'horizons-console-error',
  97. error: errorString
  98. }, '*');
  99. };
  100. </script>
  101. <script type="module">
  102. const originalFetch = window.fetch;
  103.  
  104. window.fetch = function(...args) {
  105. const url = args[0] instanceof Request ? args[0].url : args[0];
  106.  
  107. // Skip WebSocket URLs
  108. if (url.startsWith('ws:') || url.startsWith('wss:')) {
  109. return originalFetch.apply(this, args);
  110. }
  111.  
  112. return originalFetch.apply(this, args)
  113. .then(async response => {
  114. const contentType = response.headers.get('Content-Type') || '';
  115.  
  116. // Exclude HTML document responses
  117. const isDocumentResponse =
  118. contentType.includes('text/html') ||
  119. contentType.includes('application/xhtml+xml');
  120.  
  121. if (!response.ok && !isDocumentResponse) {
  122. const responseClone = response.clone();
  123. const errorFromRes = await responseClone.text();
  124. const requestUrl = response.url;
  125. console.error(`Fetch error from ${requestUrl}: ${errorFromRes}`);
  126. }
  127.  
  128. return response;
  129. })
  130. .catch(error => {
  131. if (!url.match(/.html?$/i)) {
  132. console.error(error);
  133. }
  134.  
  135. throw error;
  136. });
  137. };
  138. </script>
  139. </head>
  140. <body>
  141. <div id="root"></div>
  142. </body>
  143. </html>
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda