From 968a1a63f8e625994b40b7d2af2d22940285c63c Mon Sep 17 00:00:00 2001 From: Matěj Cepl Date: Sun, 5 Jun 2011 23:34:55 +0200 Subject: Move attachments and comments functions into four separate objects. Specifically there are objects AttachList, Attachment, Comment, and CommentList. --- data/lib/collectingMetadata.js | 182 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 data/lib/collectingMetadata.js (limited to 'data/lib/collectingMetadata.js') diff --git a/data/lib/collectingMetadata.js b/data/lib/collectingMetadata.js new file mode 100644 index 0000000..efd9754 --- /dev/null +++ b/data/lib/collectingMetadata.js @@ -0,0 +1,182 @@ +// Released under the MIT/X11 license +// http://www.opensource.org/licenses/mit-license.php +"use strict"; + +function Comment(comment) { + var nameSpan = comment.querySelector(".bz_comment_user a.email"); + var timeSpan = comment.getElementsByClassName("bz_comment_time")[0]; + + this.author = parseMailto(nameSpan).trim(); + this.element = comment; + this.date = parseBZCommentDate(timeSpan.textContent.trim()); + this.timeSpan = timeSpan; +} + + +function CommentList(doc) { + var comments = document.getElementById("comments"). + getElementsByClassName("bz_comment"); + comments = []; + Array.forEach(comments, function(item) { + var com = new Comment(item); + if (com.element) { + comments[ISODateString(com.date)] = com; + } + }); + this.comments = comments; +} + +/** + * Set background color of all comments made by reporter in ReporterColor color + * + */ +CommentList.prototype.colorComments = function colorComments() { + var reporter = getReporter(); + var reporterComments = this.comments.filter(function (com) { + return com.author === reporter; + }); + reporterComments.forEach(function (com) { + com.element.style.backgroundColor = ReporterColor.toString(); + }); +} + +CommentList.prototype.getAllCommentsText = function getAllCommentsText() { + return this.comments.reduce(function (outStr, com) { + outStr += com.getElementsByTagName("pre")[0].textContent + "\n"; + }).trim(); +} + +// ----------------------------------------------------------- + +/** + * Parse the row with the attachment and create new Attachment object + * + * @param DOM + * element to be parsed + * + * TODO error handling is missing ... it's bleee + * + * [ attName, id, MIMEtype, size, inElem ]; + */ +function Attachment(inElem) { + // Skip over obsolete attachments + if (inElem.getElementsByClassName("bz_obsolete").length > 0) { + return; // FIXME how NOT to create an object? + } + + // getting name of the attachment + this.name = inElem.getElementsByTagName("b")[0].textContent.trim(); + + // TODO probably could use url.URL object + var aHrefsArr = inElem.getElementsByTagName("a"); + var aHref = Array.filter(aHrefsArr, function(x) { + return x.textContent.trim() === "Details"; + })[0]; + this.id = parseURL(aHref.getAttribute("href")).params.id; + + // getting MIME type and size + var stringArray = inElem.getElementsByClassName("bz_attach_extra_info")[0]. + textContent.replace(/[\n ()]+/g, " ").trim().split(", "); + this.size = parseInt(stringArray[0], 10); + this.mimeType = stringArray[1].split(" ")[0]; + this.element = inElem; +}; + +Attachment.prototype.isBadMIME = function isBadMIME() { + var badMIMEArray = [ "application/octet-stream", "text/x-log", "undefined" ]; + return isInList(this.mimeType, badMIMEArray); +}; + +Attachment.prototype.checkXorgLink = function checkXorgLink() { + var elemS = this.element.getElementsByTagName("td"); + var elem = elemS[elemS.length - 1]; + createDeadLink("xorgLogAnalyzeLink", "check", elem, + analyzeXorgLog, [this.id, "AnalyzeXorgLogBacktrace"], "br"); +}; + +Attachment.prototype.isParsed = function isParsed() { + var titleParsedAttachment = "Part of the thread where crash happened"; + return (new RegExp(titleParsedAttachment).test(this.name)); +}; + +// ---------------------------------------------------------------------------- +function AttachList(doc) { + this.attachments = []; + var attach = {}; + var attElements = doc.getElementById("attachment_table"). + getElementsByTagName("tr"); + // FIXME change into list of objects and both comments and + // attachments (and something else?) should be properties of one + // huge object + for ( var i = 1, ii = attElements.length - 1; i < ii; i++) { + attach = new Attachment(attElements[i]); + if (attach.id) { + this.attachments.push(attach); + } + } +} + +AttachList.prototype.getBadAttachments = function getBadAttachments() { + return this.attachments.filter(function(att) { + return (att.isBadMIME()); + }); +} + +/** + * Add a link opening selected lines of Xorg.0.log + */ +AttachList.prototype.addCheckXorgLogLink = function addCheckXorgLogLink() { + if (config.XorgLogAnalysis) { + this.attachments.forEach(function (att) { + att.checkXorgLink(); + }); + } +} + +/** + * Make it sailent that the some attachments with bad MIME type are present + * + * @param atts + * Array of attachments subarrays + * @return none + */ +AttachList.prototype.markBadAttachments = function markBadAttachments() { + if (!constantData.passwordState.passAvailable) { + console.log("markBadAttachments : No password, no XML-RPC calls; sorry"); + return null; + } + + var badAttachments = this.getBadAttachments(); + + if (badAttachments.length > 0) { + var titleElement = document. + getElementsByClassName("bz_alias_short_desc_container")[0]; + titleElement.style.backgroundColor = "olive"; + + createDeadLink("fixAllButton", "Fix all", titleElement, function() { + Array.forEach(badAttachments, function(x) { + fixAttachById(x[1], constantData.XMLRPCData[window.location.hostname].url); + }); + }, [], false, null, "f"); + badAttachments.forEach(function(x, i, a) { + addTextLink(x, constantData.XMLRPCData[window.location.hostname].url); + }); + } +}; + +AttachList.prototype.getParsedAttachments = function getParsedAttachments() { + return this.attachments.filter(function (att) { + return (att.isParsed()); + }); +}; + +AttachList.prototype.getXorgList = function getXorgList() { + return this.attachments.filter(function (value) { + // Xorg.0.log must be text, otherwise we cannot parse it + return (/[xX].*log/.test(value.name) && /text/.test(value.mimeType)); + }); +}; + +AttachList.prototype.forEach = function forEach(fce) { + this.attachments.forEach(fce); +}; -- cgit