[FIX] SEO according to mockup

bzr revid: ddm@openerp.com-20130912153338-00oh2h3qals2h2g9
This commit is contained in:
ddm
2013-09-12 17:33:38 +02:00
parent 28043e7262
commit 0673d95ff5
3 changed files with 39 additions and 99 deletions
+14 -23
View File
@@ -27,21 +27,16 @@
this.xml = text;
},
isWellFormed: function () {
try {
if (document.implementation.createDocument) {
var dom = new DOMParser().parseFromString(this.xml, "text/xml");
return dom.getElementsByTagName("parsererror").length === 0;
} else if (window.ActiveXObject) {
// TODO test in IE
var msDom = new ActiveXObject("Microsoft.XMLDOM");
msDom.async = false;
return !msDom.loadXML(this.xml);
} else {
throw Error("Not implemented");
}
} catch(exception) {
console.log(exception);
if (document.implementation.createDocument) {
var dom = new DOMParser().parseFromString(this.xml, "text/xml");
return dom.getElementsByTagName("parsererror").length === 0;
} else if (window.ActiveXObject) {
// TODO test in IE
var msDom = new ActiveXObject("Microsoft.XMLDOM");
msDom.async = false;
return !msDom.loadXML(this.xml);
}
return true;
},
format: function () {
return vkbeautify.xml(this.xml, 4);
@@ -101,15 +96,11 @@
method: 'read',
args: [[this.selectedViewId()], ['arch'], website.get_context()],
}).then(function(result) {
if (result && result.length > 0) {
var xml = new website.ace.XmlDocument(result[0].arch)
var editingSession = new ace.EditSession(xml.xml);
editingSession.setMode("ace/mode/xml");
editingSession.setUndoManager(new ace.UndoManager());
editor.setSession(editingSession);
} else {
throw Error("Could not load view XML");
}
var xml = new website.ace.XmlDocument(result[0].arch);
var editingSession = new ace.EditSession(xml.xml);
editingSession.setMode("ace/mode/xml");
editingSession.setUndoManager(new ace.UndoManager());
editor.setSession(editingSession);
});
},
formatXml: function () {
+11 -56
View File
@@ -77,6 +77,10 @@
this.type = this.types[options.type] || 'default';
this._super(parent);
},
start: function () {
this.suggestionList = new website.seo.SuggestionList(this, this.keyword);
this.suggestionList.appendTo(this.$('.js_seo_keyword_suggestion'));
},
destroy: function () {
this.trigger('removed');
this._super();
@@ -145,8 +149,8 @@
website.seo.SuggestionList = openerp.Widget.extend({
template: 'website.seo_list',
init: function (parent) {
this.rootWords = [];
init: function (parent, word) {
this.word = word;
this._super(parent);
},
start: function () {
@@ -154,14 +158,9 @@
},
refresh: function () {
var self = this;
self.$el.empty();
self.$el.append("Loading...");
var requests = _.map(this.rootWords, function (word) {
// cf. https://github.com/ddm/seo
// TODO Try with /recommend/
return $.getJSON("http://seo.eu01.aws.af.cm/suggest/"+encodeURIComponent(word));
});
function addSuggestions (list) {
self.$el.empty();
// TODO Improve algorithm + Ajust based on custom user keywords
var nameRegex = new RegExp(self.companyName, "gi");
var cleanList = _.map(list, function removeCompanyName (word) {
@@ -181,38 +180,7 @@
}
});
}
var deferred = $.Deferred();
var suggestions = [];
$.when.apply($, requests).then(function (result) {
self.$el.empty();
if (result && _.isArray(result[0])) {
var suggestionLists = _.map(Array.prototype.slice.call(arguments), function (l) {
return l[0];
});
_.each(suggestionLists, function (newSuggestions) {
suggestions = suggestions.concat(newSuggestions);
});
deferred.resolve(_.uniq(suggestions));
} else if (result && _.isString(result[0])) {
deferred.resolve(_.uniq(result));
}
});
$.when(deferred).then(addSuggestions);
},
suggestions: function () {
return this.$('.js_seo_suggestion').map(function () {
return $(this).data('keyword');
});
},
addRootWord: function (word) {
this.rootWords.push(word);
this.refresh();
},
removeRootWord: function (word) {
this.rootWords = _.reject(this.rootWords, function (rootWord) {
return rootWord === word;
});
this.refresh();
$.getJSON("http://seo.eu01.aws.af.cm/suggest/"+encodeURIComponent(this.word), addSuggestions);
},
});
@@ -283,14 +251,6 @@
.prop('disabled', false).removeClass('disabled');
});
this.keywordList.appendTo($modal.find('.js_seo_keywords_list'));
this.suggestionList = new website.seo.SuggestionList(this, companyName);
this.suggestionList.on('selected', self, function (word) {
self.acceptSuggestion(word);
});
this.keywordList.on('removed', self, function (word) {
this.suggestionList.removeRootWord(word);
});
this.suggestionList.appendTo($modal.find('.js_seo_suggestions_list'));
var companyName = pageParser.company().toLowerCase();
this.addKeyword(companyName);
$modal.modal();
@@ -299,13 +259,13 @@
var tips = [];
var self = this;
function displayTip(message, type) {
new website.seo.Tip(this, {
new website.seo.Tip(self, {
message: message,
type: type
type: type,
}).appendTo(self.$('.js_seo_tips'));
}
var pageParser = parser || new website.seo.PageParser();
if (!pageParser.headers('h1').length === 0) {
if (pageParser.headers('h1').length === 0) {
tips.push({
type: 'warning',
message: "You don't have an <h1> tag on your page.",
@@ -334,13 +294,8 @@
var $input = this.$('input[name=seo_page_keywords]');
var keyword = _.isString(word) ? word : $input.val();
this.keywordList.add(keyword, false);
this.suggestionList.addRootWord(keyword);
$input.val("");
},
acceptSuggestion: function (suggestion) {
this.keywordList.add(suggestion, true);
this.suggestionList.addRootWord(suggestion);
},
update: function () {
var data = {
title: this.$('input[name=seo_page_title]').val(),
+14 -20
View File
@@ -11,14 +11,8 @@
</div>
<div class="modal-body">
<div class="js_seo_tips" />
<section>
<section class="js_seo_keywords_list">
<h3 class="page-header">1. Define keywords <small>describing your page content</small></h3>
<dl class="dl-horizontal">
<dt>Suggestions</dt>
<dd class="js_seo_suggestions_list">
<!-- filled in JS -->
</dd>
</dl>
<div class="form-horizontal" role="form">
<div class="form-group">
<label for="seo_page_keywords" class="col-lg-2 control-label">New keyword</label>
@@ -32,12 +26,7 @@
</div>
</div>
</div>
<dl class="dl-horizontal oe_seo_keywords_list">
<dt>Current selection</dt>
<dd class="js_seo_keywords_list">
<!-- filled in JS -->
</dd>
</dl>
<!-- filled in JS -->
</section>
<section>
<h3 class="page-header">2. Choose a title and description <small>containing keywords relevant to what people are searching on the web</small></h3>
@@ -86,13 +75,18 @@
</t>
<t t-name="website.seo_keyword">
<li class="oe_seo_keyword">
<span t-attf-class="label label-#{ widget.type } js_seo_keyword" t-att-data-keyword="widget.keyword">
<t t-raw="widget.keyword"/>
&amp;nbsp;
<a href="#" class="oe_remove" data-action="remove-keyword">x</a>
</span>
</li>
<dl class="dl-horizontal js_seo_keyword">
<dt>
<span t-attf-class="label label-#{ widget.type } js_seo_keyword" t-att-data-keyword="widget.keyword">
<t t-raw="widget.keyword"/>
&amp;nbsp;
<a href="#" class="oe_remove" data-action="remove-keyword">x</a>
</span>
</dt>
<dd class="js_seo_keyword_suggestion">
<!-- filled in JS -->
</dd>
</dl>
</t>
<t t-name="website.seo_suggestion">