diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly
index a450bc6bc2e49e48e682b59e45efc3a0aee713a4..2e211b6221287f49c065d8e7d40d580dc588c55c 100644
--- a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly
+++ b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly
@@ -34,7 +34,7 @@ THE SOFTWARE.
+ codemirror-mode="${app.markupFormatter.codeMirrorMode}" codemirror-config="${app.markupFormatter.codeMirrorConfig}" previewEndpoint="/markupFormatter/previewDescription"/>
diff --git a/core/src/main/resources/hudson/model/Job/configure.jelly b/core/src/main/resources/hudson/model/Job/configure.jelly
index 3000b57320e2606b1635954efe3ad256ae540406..dcfc7ee5dde4f14b3b0f471536b0a2196a8d40ea 100644
--- a/core/src/main/resources/hudson/model/Job/configure.jelly
+++ b/core/src/main/resources/hudson/model/Job/configure.jelly
@@ -41,7 +41,7 @@ THE SOFTWARE.
-
+
diff --git a/core/src/main/resources/hudson/model/Run/configure.jelly b/core/src/main/resources/hudson/model/Run/configure.jelly
index c71262878db967182fbb52e2b4aebc1e5a718bfa..52c9ff41426a11e152887fb30002e1817296bc9a 100644
--- a/core/src/main/resources/hudson/model/Run/configure.jelly
+++ b/core/src/main/resources/hudson/model/Run/configure.jelly
@@ -33,7 +33,7 @@ THE SOFTWARE.
-
+
diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly
index 5253f0272ac5c3e462a412e54400c267ba1f3645..e8817cc5452ce36664f2925e30feb83f8c187bb6 100644
--- a/core/src/main/resources/hudson/model/View/configure.jelly
+++ b/core/src/main/resources/hudson/model/View/configure.jelly
@@ -39,7 +39,7 @@ THE SOFTWARE.
-
+
diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly
index c4ba3f6a358da952debb56698d7d6ebbce31cb2b..5bee9554029da4eefec341c99c4defdc7d645a05 100644
--- a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly
+++ b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly
@@ -48,7 +48,7 @@ THE SOFTWARE.
+ codemirror-mode="${app.markupFormatter.codeMirrorMode}" codemirror-config="${app.markupFormatter.codeMirrorConfig}" previewEndpoint="/markupFormatter/previewDescription"/>
diff --git a/core/src/main/resources/lib/form/textarea.jelly b/core/src/main/resources/lib/form/textarea.jelly
index 0a940dfd542d4faf01294fcab5721e7dd93998f2..a75866117795735ea318f97e6fe43630f41af6df 100644
--- a/core/src/main/resources/lib/form/textarea.jelly
+++ b/core/src/main/resources/lib/form/textarea.jelly
@@ -60,6 +60,10 @@ THE SOFTWARE.
Specifies additional key/value pairs in the JSON format (except the start and end bracket)
to be passed as CodeMirror option object.
+
+ If specified, this text area has preview feature.
+ The previewEndpoint is used to obtain formatted html.
+
@@ -80,4 +84,14 @@ THE SOFTWARE.
+
+
+
diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css
index eb88fdde1897aba8fe94a29f7d1cc12e4d36c02d..c8ab78010b1bd020433e5a20ee9075c243bb43b5 100644
--- a/war/src/main/webapp/css/style.css
+++ b/war/src/main/webapp/css/style.css
@@ -1003,3 +1003,13 @@ table.progress-bar.red td.progress-bar-done {
.tag7 { font-size: 1.70em; }
.tag8 { font-size: 1.80em; }
.tag9 { font-size: 1.90em; }
+
+/* ========================= textarea.jelly ================== */
+
+.textarea-preview-container {
+ text-align:left;
+}
+.textarea-preview {
+ background-color: #F0F0F0;
+ padding: 0.5em;
+}
diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js
index a71d00b9f2f81623ea49413e2b1b2248ca9859d8..bf2bc6d1becf5073b8dbc4a743095cc959a89eb4 100644
--- a/war/src/main/webapp/scripts/hudson-behavior.js
+++ b/war/src/main/webapp/scripts/hudson-behavior.js
@@ -1194,6 +1194,45 @@ var hudsonRules = {
".button-with-dropdown" : function (e) {
new YAHOO.widget.Button(e, { type: "menu", menu: e.nextSibling });
+ },
+
+ "DIV.textarea-preview-container" : function (e) {
+ var previewDiv = findElementsBySelector(e,".textarea-preview")[0];
+ var showPreview = findElementsBySelector(e,".textarea-show-preview")[0];
+ var hidePreview = findElementsBySelector(e,".textarea-hide-preview")[0];
+ $(hidePreview).hide();
+ $(previewDiv).hide();
+
+ showPreview.onclick = function() {
+ // Several TEXTAREAs may exist if CodeMirror is enabled. The first one has reference to the CodeMirror object.
+ var textarea = e.parentNode.getElementsByTagName("TEXTAREA")[0];
+ var text = textarea.codemirrorObject ? textarea.codemirrorObject.getValue() : textarea.value;
+ var render = function(txt) {
+ $(hidePreview).show();
+ $(previewDiv).show();
+ previewDiv.innerHTML = txt;
+ };
+
+ new Ajax.Request(rootURL + showPreview.getAttribute("previewEndpoint"), {
+ method: "POST",
+ requestHeaders: "Content-Type: application/x-www-form-urlencoded",
+ parameters: {
+ text: text
+ },
+ onSuccess: function(obj) {
+ render(obj.responseText)
+ },
+ onFailure: function(obj) {
+ render(obj.status + " " + obj.statusText + "
" + obj.responseText)
+ }
+ });
+ return false;
+ }
+
+ hidePreview.onclick = function() {
+ $(hidePreview).hide();
+ $(previewDiv).hide();
+ };
}
};
@@ -2357,4 +2396,3 @@ function createComboBox(idOrField,valueFunction) {
Ajax.Request.prototype.dispatchException = function(e) {
throw e;
}
-