Yuval Adam
Yuval Adam

Reputation: 165242

Is it possible to create an HTML quine?

Per the title, is it possible to create a (non-trivial) quine in HTML?

My definition of an HTML quine:

A non-trivial HTML quine is one that is not null and uses at least one HTML tag, under the assumption that some string in an HTML file is rendered by a browser as plain text. An HTML quine is defined such that the output of the q.html as rendered by a standard browser is the contents of q.html itself.

(I'm open for any comments on this definition, I kind of hacked it up right now)

HTML is not turing-complete, therefore the fixed-point theorem cannot be applied to prove that it is indeed possible.

However, this does not necessarily mean an HTML quine is impossible. Or can it in fact be proven that an HTML quine is impossible?

Upvotes: 14

Views: 2503

Answers (4)

user14459251
user14459251

Reputation:

You can't.

<!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>

You can cheat though and do

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

Upvotes: -1

Thomas W
Thomas W

Reputation: 15371

It's certainly not possible with "plain" HTML. Obviously it would be possible to do with JavaScript, but it's also possible with 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>

Upvotes: 20

devshorts
devshorts

Reputation: 8872

Sure, just like with all HTML "what ifs", the answer is just use JQuery!

Upvotes: -6

Rob
Rob

Reputation: 15160

This is not possible. Since every unescaped element will be interpreted as markup by the browser, the browser will attempt to render or handle the contents of those elements or as a control. You cannot display an element that is not escaped in some way, such as with the <pre> tag. But then such tags will also not be displayed.

Of course, you could serve it as text/plain with appropriate HTTP headers but, then, that's not HTML. Just using the .html extension will make browsers render it as html anyway in most (all?) cases.

Upvotes: 0

Related Questions