创建HTML quine是否可能?

14

根据标题,是否可以在HTML中创建一个(非平凡的)quine

我的HTML quine定义:

非平凡的HTML quine是指不为空且至少使用一个HTML标签的quine,假定HTML文件中的某个字符串被浏览器呈现为纯文本。HTML quine的定义是,q.html的输出由标准浏览器呈现,其内容为q.html本身。

(我对这个定义有任何意见,我现在有点随意地修改它)

HTML不是图灵完备的,因此不能应用固定点定理来证明它是否可能。

然而,这并不一定意味着HTML quine是不可能的。或者事实上可以证明HTML quine是不可能的吗?


1
这个问题应该发在http://cstheory.stackexchange.com/而不是这里吧? - Oded
2
你会写HTML程序吗? - R. Martinho Fernandes
1
由于HTML不被执行,您可能需要澄清您认为的“输出”是什么... - deceze
@Oded,我同意这是边缘的计算机科学理论,但我正在寻找一个特定于HTML的答案。 - Yuval Adam
1
刚发现了这个项目:https://secretgeek.github.io/html_wysiwyg/html.html - Rocket Nikita
显示剩余4条评论
4个回答

20

使用“普通”的HTML当然不可能。显然可以使用JavaScript来实现,但也可以使用CSS:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>This is the title</title>
<style type="text/css"><![CDATA[ 
* {
  display:inline;
  white-space:pre;
}
html:last-child {
  white-space:normal;
}
html:before  {content:'<html xmlns="http://www.w3.org/1999/xhtml">';}
html:after   {content:'</html>';}
head:before  {content:'<head>';}
head:after   {content:'</head>';}
title:before {content:'<title>';}
title:after  {content:'</title>';}
style:before {content:'<style type="text/css"><![CDATA[';}
style:after  {content:']]\00003e</style>';}
body:before  {content:'<body/>';position:absolute;left:0;}
]]></style>
</head>
<body/>
</html>

不错的想法。但是 Firefox 处理得不太好。我错过了什么? - Yuval Adam
1
Firefox显然并不总是意识到它是XHTML,并将其解析为“普通”HTML,无法正确解析CDATA转义的样式内容。将代码保存为本地quine.xhtml使Firefox能够正确处理它。 - Thomas W

0

这是不可能的。因为浏览器会解释每个未转义的元素为标记,浏览器将尝试呈现或处理这些元素的内容或作为控件。您无法显示某种方式未转义的元素,例如使用<pre>标记。但是,这样的标记也不会被显示。

当然,您可以使用适当的HTTP标头将其作为text/plain提供,但那就不是HTML了。在大多数(所有?)情况下,只需使用.html扩展名将使浏览器将其呈现为HTML。


-1
你不能。
<!DOCTYPE html>
<html>
<head>
<title></title>
<head>
<body>
<div id="quine" ></div>
<script>
document.getElementById("quine").innerHTML = document.documentElement.innerHTML.replace(/\&/g, "&amp;" ).replace(/\</g, "&lt;" ).replace(/\>/g, "&gt;");
</script>
</body>
</html>

你可以作弊,然后做

<body onload="document.getElementById("quine").innerHTML = document.documentElement.innerHTML.replace(/\&/g, "&amp;" ).replace(/\</g, "&lt;" ).replace(/\>/g, "&gt;");" >
<div id="quine" ></div>
</body>

-6

当然,就像所有HTML的“假设情况”一样,答案就是使用JQuery!


虽然我意识到我的话有点玩笑,但你确实可以用JavaScript做到这一点。HTML quine只是意味着如果标记是“<div/>”,那么当它呈现时也会写入“<div/>”,但你可以修改实际的标记并使用JavaScript做任何你想做的事情。没有人说修改DOM不算数。 - devshorts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接