Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base: c3f5bf34cc
...
compare: 9cbf4c9269
Checking mergeability… Don't worry, you can still create the pull request.
  • 3 commits
  • 10 files changed
  • 0 commit comments
  • 1 contributor
Commits on Mar 10, 2012
@sizers dd d9f0f73
@sizers ss 11d6cd9
Commits on Mar 11, 2012
@sizers ss 9cbf4c9
View
1  .gitignore
@@ -1,3 +1,4 @@
/node_modules
/.project
/properties.js
+.settings
View
18 app.js
@@ -1,12 +1,12 @@
-
/**
* Module dependencies.
*/
-
var express = require('express');
+var mvcController = require('./modules/mvccontroller.js');
//var ejs = require('ejs');
-var util = require('./util.js');
+//var util = require('./util.js');
//var properties = require('./properties.js');
+//=>Modulization
var app = module.exports = express.createServer();
@@ -14,7 +14,6 @@ var port = (process.env.VMC_APP_PORT || 3000);
var host = (process.env.VCAP_APP_HOST || 'localhost');
// Configuration
-
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
@@ -28,22 +27,23 @@ app.configure(function(){
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
-
app.configure('production', function(){
app.use(express.errorHandler());
});
+//Is there any better idea????
app.all("/",function(req,res,next){
- util.router(req,res,next);
+ //util.router(req,res,next);
+ mvcController.mvcRoute(req,res,next);
});
app.all("/:var1",function(req,res,next){
- util.router(req,res,next);
+ mvcController.mvcRoute(req,res,next);
});
app.all("/:var1/:var2",function(req,res,next){
- util.router(req,res,next);
+ mvcController.mvcRoute(req,res,next);
});
app.all("/:var1/:var2/:var3",function(req,res,next){
- util.router(req,res,next);
+ mvcController.mvcRoute(req,res,next);
});
app.listen(port);
View
128 modules/mvccontroller.js
@@ -0,0 +1,128 @@
+var mongoose = require('mongoose');
+var properties = require('../properties.js');
+var models = require('./models.js');
+var svcController = require('./svccontroller.js');
+
+//Prototyping Date Object
+Date.prototype.format = function(f) {
+ if (!this.valueOf()) return " ";
+
+ var weekName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+ var d = this;
+
+ return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {
+ switch ($1) {
+ case "yyyy": return d.getFullYear();
+ case "yy": return (d.getFullYear() % 1000).zf(2);
+ case "MM": return (d.getMonth() + 1).zf(2);
+ case "dd": return d.getDate().zf(2);
+ case "E": return weekName[d.getDay()];
+ case "HH": return d.getHours().zf(2);
+ case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
+ case "mm": return d.getMinutes().zf(2);
+ case "ss": return d.getSeconds().zf(2);
+ case "a/p": return d.getHours() < 12 ? "AM" : "PM";
+ default: return $1;
+ }
+ });
+};
+//But I don't think it's a good idea.
+String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};
+String.prototype.zf = function(len){return "0".string(len - this.length) + this;};
+Number.prototype.zf = function(len){return this.toString().zf(len);};
+
+var renderSeed = function(title){
+ this.title = title;
+ this.postCate = properties.postCate;
+}
+
+
+
+//Routing?? or MVC Controlling??
+var mvcRoute = exports.mvcRoute = function(req, res, next){
+ var var1="",var2="",var3="";
+
+ //Am I doing the right thing??
+ if(req.params.var1) var1 = req.params.var1;
+ if(req.params.var2) var2 = req.params.var2;
+ if(req.params.var3) var3 = req.params.var3;
+
+ if(var1=="") //res.render('index',new renderSeed("MAIN"));
+ {
+ var rnsd = new renderSeed("MMMM");
+ rnsd["layout"] = "";//or Another Test;
+ res.render('rssfeed',rnsd);
+ }
+ else if(var1=="callservice") {
+ //It's Service Oriented Architecture
+ svcController.callService(req, res);
+ }
+ else if(var1=="postlist") {
+ var oSrch = {};
+ var rnsd = new renderSeed("POST LIST");
+ if(var2 != "all") oSrch = {"postCate":var2};
+ if(var2=="all") rnsd.title += " - ALL";
+ else if(var2=="dev") rnsd.title += " - Develope";
+ else if(var2=="pol") rnsd.title += " - Politics";
+ else if(var2=="les") rnsd.title += " - Leisure";
+ mongoose.connect(properties.mongodbUrl);
+ models.blogposts.find(oSrch).sort('date',-1).execFind( function (err, docs) {
+ mongoose.disconnect();
+ if(err){//throw err;
+ console.log(err);
+ }else{
+ //oOutput["blogposts"] = docs;// docs is an array
+ console.log('rietrived!');
+ for(var i=0;i<docs.length;i++){
+ docs[i]["date1"] = docs[i].date.format("yyyy-MM-dd HH:mm:ss");
+ }
+ }
+ //Blah.find({}).sort('date',-1).execFind(function(err,docs){ });
+
+ var oBind = {};
+ //if(docs.length > 0) oBind = docs[0];
+ rnsd["postlist"] = docs;
+ rnsd["lcate"] = var2;
+ res.render('postlist',rnsd);
+ });
+ }
+ else if(var1=="postview") {
+ if(!var2) {
+ res.end();
+ return;
+ }
+ var rnsd = new renderSeed("");
+
+ mongoose.connect(properties.mongodbUrl);
+ models.blogposts.findOne({_id:var2}, function (err, docs) {
+ mongoose.disconnect();
+ if(err){//throw err;
+ console.log(err);
+ }else{
+ //oOutput["blogposts"] = docs;// docs is an array
+ console.log('rietrived! content');
+ docs["date1"] = docs.date.format("yyyy-MM-dd HH:mm:ss");
+ docs["postContent"] = docs.postContent.replace(/\r\n/gi,"<br/>");
+ }
+ var oBind = {};
+ //if(docs.length > 0) oBind = docs[0];
+ rnsd["title"] = docs.postTitle;
+ rnsd["postview"] = docs;
+ rnsd["lcate"] = (req.query.lcate||"");
+ res.render('postview',rnsd);
+ });
+ }
+ else if(var1=="guestbook") res.render('guestbook',new renderSeed("Guest Book"));
+ //else if(var1=="guestbook2") res.render('guestbook2',{title:"Guest Book"});
+ else if(var1=="profile") res.render('profile',new renderSeed("My Profile"));
+ else if(var1=="admin") {
+ var rnsd = new renderSeed("Admin");
+ rnsd["adminToken"] = var2;
+
+ if(var2!=properties.adminToken) {
+ res.end("Admin authentication is not valid!!");return;
+ }
+ res.render('admin',rnsd);
+ }
+ else next();
+};
View
95 modules/svccontroller.js
@@ -0,0 +1,95 @@
+var mongoose = require('mongoose');
+var properties = require('../properties.js');
+var models = require('../modules/models.js');
+
+
+
+var callService = exports.callService = function(req, res){
+ var oInput = {};
+ var oOutput = {"retCd":"OK"};
+ if(req.body.input) {
+ oInput = JSON.parse(req.body.input);
+ if(oInput.svcId == "savePost"){
+ if(oInput.adminToken != properties.adminToken) {
+ res.end("Admin authentication is not valid!!");
+ return;
+ }
+ if(oInput._id && oInput._id.length>1){//update
+ mongoose.connect(properties.mongodbUrl);
+ models.blogposts.findById(oInput._id, function(err, oblogpost) {
+ if (!oblogpost) {
+ //return next(new Error('Could not load Document'));
+ mongoose.disconnect();
+ console.log(err);
+ res.end();
+ } else {
+ // do your updates here
+ oblogpost.postCate = unescape(oInput.postCate);
+ oblogpost.postTitle= unescape(oInput.postTitle);
+ oblogpost.postContent = unescape(oInput.postContent);
+ oblogpost.save(function(err) {
+ mongoose.disconnect();
+ if (err) {
+ console.log(err);
+ oOutput.retCd = "ER";
+ } else {
+ console.log('saved!');
+ }
+ res.end();
+ });
+ }
+ });
+ } else {
+ var oblogpost = new models.blogposts();
+ oblogpost.postCate= unescape(oInput.postCate);
+ oblogpost.postTitle= unescape(oInput.postTitle);
+ oblogpost.postContent = unescape(oInput.postContent);
+ oblogpost.date = new Date();
+ mongoose.connect(properties.mongodbUrl);
+ oblogpost.save(function(err){
+ mongoose.disconnect();
+ if(err){//throw err;
+ console.log(err);
+ oOutput.retCd = "ER";
+ }else{
+ console.log('saved!');
+ }
+ res.end(JSON.stringify(oOutput));
+ });
+ }
+ }
+ if(oInput.svcId == "delPost"){
+
+ if(oInput.adminToken != properties.adminToken) {
+ res.end("Admin authentication is not valid!!");
+ return;
+ }
+ mongoose.connect(properties.mongodbUrl);
+ models.blogposts.remove({"_id":oInput._id}, function(err) {
+ mongoose.disconnect();
+ if (err) {
+ console.log(err);
+ oOutput.retCd = "ER";
+ } else {
+ console.log('saved!');
+ }
+ res.end();
+ });
+ }
+ if(oInput.svcId == "getPostList"){
+ mongoose.connect(properties.mongodbUrl);
+ models.blogposts.find({}).sort('date',-1).execFind(function (err, docs) {
+ mongoose.disconnect();
+ if(err){//throw err;
+ console.log(err);
+ oOutput.retCd = "ER";
+ }else{
+ oOutput["blogposts"] = docs;// docs is an array
+ console.log('rietrived!');
+ }
+ res.end(JSON.stringify(oOutput));
+ });
+ }
+ }
+ else res.end();
+}
View
9 properties.js.sample
@@ -1,2 +1,9 @@
exports.adminToken = "1234";
-exports.mongodbUrl = "mongodb://blabla";
+exports.mongodbUrl = "mongodb://blabla";
+exports.postCate = [
+ {"key":"all","val":"All"},
+ {"key":"dev","val":"Develope"},
+ {"key":"pol","val":"Politics"},
+ {"key":"lei","val":"Leisure"}
+ ];
+
View
3  tmp.js
@@ -0,0 +1,3 @@
+
+
+exports.ttt = "";
View
190 util.js
@@ -1,66 +1,67 @@
var mongoose = require('mongoose');
var properties = require('./properties.js');
var models = require('./modules/models.js');
+var svcController = require('./modules/svccontroller.js');
-
+//Prototyping Date Object
Date.prototype.format = function(f) {
- if (!this.valueOf()) return " ";
+ if (!this.valueOf()) return " ";
- var weekName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
- var d = this;
-
- return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {
- switch ($1) {
- case "yyyy": return d.getFullYear();
- case "yy": return (d.getFullYear() % 1000).zf(2);
- case "MM": return (d.getMonth() + 1).zf(2);
- case "dd": return d.getDate().zf(2);
- case "E": return weekName[d.getDay()];
- case "HH": return d.getHours().zf(2);
- case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
- case "mm": return d.getMinutes().zf(2);
- case "ss": return d.getSeconds().zf(2);
- case "a/p": return d.getHours() < 12 ? "AM" : "PM";
- default: return $1;
- }
- });
+ var weekName = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+ var d = this;
+
+ return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {
+ switch ($1) {
+ case "yyyy": return d.getFullYear();
+ case "yy": return (d.getFullYear() % 1000).zf(2);
+ case "MM": return (d.getMonth() + 1).zf(2);
+ case "dd": return d.getDate().zf(2);
+ case "E": return weekName[d.getDay()];
+ case "HH": return d.getHours().zf(2);
+ case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);
+ case "mm": return d.getMinutes().zf(2);
+ case "ss": return d.getSeconds().zf(2);
+ case "a/p": return d.getHours() < 12 ? "AM" : "PM";
+ default: return $1;
+ }
+ });
};
-
+//But I don't think it's a good idea.
String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};
String.prototype.zf = function(len){return "0".string(len - this.length) + this;};
Number.prototype.zf = function(len){return this.toString().zf(len);};
+//It's a useful mehtod
+var dump = exports.dump = function (obj, name) {
+ var indent = " ";
+ if (typeof obj == "object") {
+ var child = null;
+ var output = (name) ? indent + name + "\n" : "";
+ indent += "\t";
-var dump = function (obj, name) {
- var indent = " ";
- if (typeof obj == "object") {
- var child = null;
- var output = (name) ? indent + name + "\n" : "";
- indent += "\t";
-
- for (var item in obj)
- {
- try {
- child = obj[item];
- } catch (e) {
- child = "<Unable to Evaluate>";
- }
-
- if (typeof child == "object") {
- output += dump(child, item);
- } else {
- output += indent + item + ": " + child + "\n";
- }
- }
-
- return output;
+ for (var item in obj)
+ {
+ try {
+ child = obj[item];
+ } catch (e) {
+ child = "<Unable to Evaluate>";
+ }
- } else {
- return obj;
- }
+ if (typeof child == "object") {
+ output += dump(child, item);
+ } else {
+ output += indent + item + ": " + child + "\n";
+ }
+ }
+ return output;
+ } else {
+ return obj;
+ }
};
-exports.router = function(req, res, next){
+
+//Routing?? or MVC Controlling??
+var router = exports.router = function(req, res, next){
var var1="",var2="",var3="";
//Am I doing the right thing??
@@ -70,88 +71,8 @@ exports.router = function(req, res, next){
if(var1=="") res.render('index',{title:"MAIN"});
else if(var1=="callservice") {
- var oInput = {};
- var oOutput = {"retCd":"OK"};
- if(req.body.input) {
- oInput = JSON.parse(req.body.input);
- if(oInput.svcId == "savePost"){
- if(oInput.adminToken != properties.adminToken) {
- res.end("Admin authentication is not valid!!");
- return;
- }
- if(oInput._id && oInput._id.length>1){//update
- mongoose.connect(properties.mongodbUrl);
- models.blogposts.findById(oInput._id, function(err, oblogpost) {
- if (!oblogpost) {
- //return next(new Error('Could not load Document'));
- console.log(err);
- res.end();
- } else {
- // do your updates here
- oblogpost.postCate = unescape(oInput.postCate);
- oblogpost.postTitle= unescape(oInput.postTitle);
- oblogpost.postContent = unescape(oInput.postContent);
- oblogpost.save(function(err) {
- if (err) {
- console.log(err);
- oOutput.retCd = "ER";
- } else {
- console.log('saved!');
- }
- res.end();
- });
- }
- });
- } else {
- var oblogpost = new models.blogposts();
- oblogpost.postCate= unescape(oInput.postCate);
- oblogpost.postTitle= unescape(oInput.postTitle);
- oblogpost.postContent = unescape(oInput.postContent);
- oblogpost.date = new Date();
- mongoose.connect(properties.mongodbUrl);
- oblogpost.save(function(err){
- if(err){//throw err;
- console.log(err);
- oOutput.retCd = "ER";
- }else{
- console.log('saved!');
- }
- res.end(JSON.stringify(oOutput));
- });
- }
- }
- if(oInput.svcId == "delPost"){
-
- if(oInput.adminToken != properties.adminToken) {
- res.end("Admin authentication is not valid!!");
- return;
- }
- mongoose.connect(properties.mongodbUrl);
- models.blogposts.remove({"_id":oInput._id}, function(err) {
- if (err) {
- console.log(err);
- oOutput.retCd = "ER";
- } else {
- console.log('saved!');
- }
- res.end();
- });
- }
- if(oInput.svcId == "getPostList"){
- mongoose.connect(properties.mongodbUrl);
- models.blogposts.find({}).sort('date',-1).execFind(function (err, docs) {
- if(err){//throw err;
- console.log(err);
- oOutput.retCd = "ER";
- }else{
- oOutput["blogposts"] = docs;// docs is an array
- console.log('rietrived!');
- }
- res.end(JSON.stringify(oOutput));
- });
- //mongoose.close();
- }
- }
+ //It's Service Oriented Architecture
+ svcController.callService(req, res);
}
else if(var1=="postlist") {
var oSrch = {};
@@ -163,6 +84,7 @@ exports.router = function(req, res, next){
else if(var2=="les") title += " - Leisure";
mongoose.connect(properties.mongodbUrl);
models.blogposts.find(oSrch).sort('date',-1).execFind( function (err, docs) {
+ mongoose.disconnect();
if(err){//throw err;
console.log(err);
}else{
@@ -189,6 +111,7 @@ exports.router = function(req, res, next){
}
mongoose.connect(properties.mongodbUrl);
models.blogposts.findOne({_id:var2}, function (err, docs) {
+ mongoose.disconnect();
if(err){//throw err;
console.log(err);
}else{
@@ -215,12 +138,5 @@ exports.router = function(req, res, next){
res.render('admin',{title:"Admin",adminToken:var2});
}
else next();
- //res.end();
- /*
- res.render(
- 'index',
- {title: 'Cleaning Supplies', supplies: ['mop', 'broom', 'duster'] }
- )
- */
};
View
48 views/index.ejs
@@ -34,50 +34,4 @@
</p>
</div></div>
-</div>
-<!--
-<div id="mainpan">
- <div class="mblock"><div class="inmblock">
- <h3><a href="#">Super mega best header</a></h3>
- <a href="http://www.favobit.com/"><img src="favobig.jpg" width="100" height="100" alt="just image example" /></a>
- <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin eu est ut mi ornare placerat. <a href="#">Suspendisse felis odio, elementum non, blandit vel, auctor eget, nunc</a>. Fusce convallis dignissim odio. Phasellus commodo egestas felis. Praesent eu sem at mi tempus egestas. Donec mollis. Morbi in lectus id magna dictum eleifend. Morbi vel diam quis sapien sollicitudin lacinia. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In consequat facilisis turpis. Proin erat dui, dictum nec, tincidunt nec, pharetra nec, tellus. Curabitur facilisis, nulla a tincidunt gravida, leo pede porttitor odio, ac adipiscing felis leo sit amet justo. Nunc egestas sodales sem. Duis ac mauris eu enim scelerisque mattis. Vivamus tortor neque, ultricies vel, dignissim nec, porttitor pulvinar, wisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis ipsum nibh, nonummy sit amet, gravida et, ultrices at, wisi. Pellentesque iaculis auctor risus. Nullam mauris. Etiam pede tortor, auctor at, aliquet sit amet, hendrerit.</p>
- <div class="comments">Posted on: August 24th, 2005 <a href="#">read more...</a></div>
- </div></div>
- <div class="mblock">
- <div class="inmblock">
- <h3><a href="#">Super mega best header 2 with various elements such as ul, ol, dl</a></h3>
- <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin eu est ut mi ornare placerat. Suspendisse felis odio, elementum non, blandit vel, auctor eget, nunc. Fusce convallis dignissim odio. Phasellus commodo egestas felis. Praesent eu sem at mi tempus egestas. Donec mollis. Morbi in lectus id magna dictum eleifend. Morbi vel diam quis sapien sollicitudin lacinia. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In consequat facilisis turpis. Proin erat dui, dictum nec, tincidunt nec, pharetra nec, tellus. Curabitur facilisis, nulla a tincidunt gravida, leo pede porttitor odio, ac adipiscing felis leo sit amet justo. Nunc egestas sodales sem. Duis ac mauris eu enim scelerisque mattis. Vivamus tortor neque, ultricies vel, dignissim nec, porttitor pulvinar, wisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis ipsum nibh, nonummy sit amet, gravida et, ultrices at, wisi. Pellentesque iaculis auctor risus. Nullam mauris. Etiam pede tortor, auctor at, aliquet sit amet, hendrerit.</p>
- <ul>
- <li><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.1</a></li>
- <li><a href="http://jigsaw.w3.org/css-validator/check/referer">Valid CSS!</a></li>
- <li>test unordered list text</li>
- </ul>
- <ol>
- <li><a href="http://validator.w3.org/check?uri=referer">Valid XHTML 1.1</a></li>
- <li><a href="http://jigsaw.w3.org/css-validator/check/referer">Valid CSS!</a></li>
- <li>test ordered list text</li>
- </ol>
- <dl>
- <dt>test definition list</dt>
- <dd>test definition list</dd>
- </dl>
- <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin eu est ut mi ornare placerat. Suspendisse felis odio, elementum non, blandit vel, auctor eget, nunc. Fusce convallis dignissim odio. Phasellus commodo egestas felis. Praesent eu sem at mi tempus egestas. Donec mollis. Morbi in lectus id magna dictum eleifend. Morbi vel diam quis sapien sollicitudin lacinia. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In consequat facilisis turpis. Proin erat dui, dictum nec, tincidunt nec, pharetra nec, tellus. Curabitur facilisis, nulla a tincidunt gravida, leo pede porttitor odio, ac adipiscing felis leo sit amet justo. Nunc egestas sodales sem. Duis ac mauris eu enim scelerisque mattis. Vivamus tortor neque, ultricies vel, dignissim nec, porttitor pulvinar, wisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis ipsum nibh, nonummy sit amet, gravida et, ultrices at, wisi. Pellentesque iaculis auctor risus. Nullam mauris. Etiam pede tortor, auctor at, aliquet sit amet, hendrerit.</p>
- </div>
- </div>
- <div class="mblock">
- <div class="inmblock">
- <h3><a href="http://www.supertramp.com/">Supertramp > The Logical Song</a></h3>
- <p><code>When I was young, it seemed that life was so wonderful,
- A miracle, oh it was beautiful, magical.
- And all the birds in the trees, well they'd be singing so happily,
- Joyfully, playfully watching me.</code>
- <a href="http://www.scootertechno.com/archives/release.asp?id=21">Yeaaah!</a> - mixed by Scooter
- <code>But then they send me away to teach me how to be sensible,
- Logical, responsible, practical.
- And they showed me a world where I could be so dependable,
- Clinical, intellectual, cynical.</code>
- </p>
- </div>
- </div>
-</div>
--->
+</div>
View
5 views/layout.ejs
@@ -129,10 +129,15 @@
<li><a href="/">Home</a></li>
<br/>
<li><a href="/postlist/all">Post Category</a></li>
+ <%for(var i=0;i<postCate.length;i++){%>
+ <li><a href="/postlist/<%=postCate[i].key%>">- <%=postCate[i].val%></a></li>
+ <%}%>
+ <!--
<li><a href="/postlist/all">- All</a></li>
<li><a href="/postlist/dev">- Develope</a></li>
<li><a href="/postlist/pol">- Politics</a></li>
<li><a href="/postlist/les">- Leisure</a></li>
+ -->
<br/>
<li><a href="/guestbook">Guest Book</a></li>
<!--<li><a href="/guestbook2">GUEST_BOOK2</a></li>-->
View
5 views/rssfeed.ejs
@@ -0,0 +1,5 @@
+<xml>
+
+ <%=title%>
+
+</xml>

No commit comments for this range

Something went wrong with that request. Please try again.