Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
Renders UML diagram as defined in a text file. For full syntax, see:
http://plantuml.sourceforge.net/index.html

To install this development version:

1. Clone this repo locally
2. Visit chrome://extensions/
3. Ensure that 'Developer mode' is switched on
4. Click "Load Unpacked"
5. Select the PlantUML source directory

To install the official version:

1. Install the extension from Chrome Web Store.
2. Check "Allow access to file URLs" in chrome://extensions/.
3. Open local or remote text file with UML diagram definition in browser (the text starts with @startuml).
Expand All @@ -19,4 +29,4 @@ This extension does not require any permissions.

## Credits

Credits go to Arnaud Roques, the author of the PlantUML. If you like this plugin, support the original author via the PayPal button on the PlantUML site (http://plantuml.sourceforge.net/index.html).
Credits go to Arnaud Roques, the author of the PlantUML. If you like this plugin, support the original author via the PayPal button on the PlantUML site (http://plantuml.sourceforge.net/index.html).
209 changes: 107 additions & 102 deletions plantuml/content-script.js
Original file line number Diff line number Diff line change
@@ -1,102 +1,107 @@
if (!document.doctype &&
document.documentElement.namespaceURI == 'http://www.w3.org/1999/xhtml' &&
document.body.textContent.substr(0, '@start'.length) == '@start') {
chrome.extension.sendRequest({
command: 'showPageAction'
});
var data = document.body.textContent;
var reload = true;
var shown = false;
var type = 'none';

function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}

var showXhr;
var show = function(force) {
shown = shown || force;
if (showXhr)
showXhr.abort();

chrome.extension.sendRequest({ command: 'compress', data: data }, function(response) {
var url = [
response.settings.server,
response.settings.type,
response.data
].join('/');

switch (response.settings.type) {
case 'img':
document.body.innerHTML = ['<img id="im" src="', escapeHtml(url), '" />'].join('');
break;

case 'svg':
document.body.innerHTML = ['<img id="im" src="', escapeHtml(url), '" />'].join('');
break;

case 'txt':
document.body.innerHTML = '';
showXhr = new XMLHttpRequest();
showXhr.onreadystatechange = function() {
if (showXhr.readyState == 4 && showXhr.status != 404) {
document.body.innerHTML = ['<pre>' + escapeHtml(showXhr.responseText) + '</pre>'].join('');
}
}
showXhr.open('GET', url);
showXhr.send(null);
break;

default:
case 'none':
document.body.innerHTML = ['<pre>' + escapeHtml(data) + '</pre>'];
break;
}
});
}

if (location.protocol == 'file:') {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status != 404 && (!shown || data != xhr.responseText)) {
data = xhr.responseText;
show(true);
}
};
var update = function() {
if (!shown || reload) {
xhr.abort();
xhr.open('GET', location.href + '?t=' + +new Date, true);
xhr.send(null);
}
};
setInterval(update, 1000);
update();
} else
show(true);

chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
/*console.log(request);
var oldSendResponse = sendResponse;
sendResponse = function() {
console.log.apply(console, arguments);
oldSendResponse.apply(this, arguments);
}*/

var command = request && request.command;
switch (command) {
case 'savedSettings':
reload = request.settings.reload;
show();
break;
}
sendResponse();
}
);
}

if(document.body.textContent.substr(0, '@startuml'.length) == '@startuml') {
translateUml(document.body);
}

var c = document.querySelectorAll('code');
var i;
for (i = 0; i < c.length; i++) {
if(c[i].textContent.substr(0, '@startuml'.length) == '@startuml') {
translateUml(c[i])
}
}

function translateUml(element) {
chrome.extension.sendRequest({
command: 'showPageAction'
});

var data = element.textContent;
var reload = true;
var shown = false;
var type = 'none';

function escapeHtml(text) {
return text
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}

var showXhr;
var show = function(force) {
shown = shown || force;
if (showXhr)
showXhr.abort();

chrome.extension.sendRequest({ command: 'compress', data: data }, function(response) {
var url = [
response.settings.server,
response.settings.type,
response.data
].join('/');

switch (response.settings.type) {
case 'img':
element.innerHTML = ['<img id="im" src="', escapeHtml(url).replace(/^http:/, "https:"), '" />'].join('');
break;

case 'svg':
element.innerHTML = ['<img id="im" src="', escapeHtml(url).replace(/^http:/, "https:"), '" />'].join('');
break;

case 'txt':
element.innerHTML = '';
showXhr = new XMLHttpRequest();
showXhr.onreadystatechange = function() {
if (showXhr.readyState == 4 && showXhr.status != 404) {
element.innerHTML = ['<pre>' + escapeHtml(showXhr.responseText) + '</pre>'].join('');
}
}
showXhr.open('GET', url);
showXhr.send(null);
break;

default:
case 'none':
element.innerHTML = ['<pre>' + escapeHtml(data) + '</pre>'];
break;
}
});
}

if (location.protocol == 'file:') {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status != 404 && (!shown || data != xhr.responseText)) {
data = xhr.responseText;
show(true);
}
};
var update = function() {
if (!shown || reload) {
xhr.abort();
xhr.open('GET', location.href + '?t=' + +new Date, true);
xhr.send(null);
}
};
setInterval(update, 1000);
update();
} else
show(true);

chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
var command = request && request.command;
switch (command) {
case 'savedSettings':
reload = request.settings.reload;
show();
break;
}
sendResponse();
}
);
}