BearND has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/316501

Change subject: WIP: add Swedish featured article
......................................................................

WIP: add Swedish featured article

Does not work yet! :((
Not sure why this returns a different response than from the API request.

When I run the following API request
https://sv.wikipedia.org/w/api.php?action=parse&format=json&prop=text&contentmodel=wikitext&text=%7B%7BUtvald+artikel%7C2016-10-11%7D%7D
I get
{"parse":{"title":"API","pageid":5657,"text":{"*":"<p>Wikipedia:Utvald 
artikel/\u00c9dith Piaf</p>\n\n"}}}

So far, so good.

But from the service,
Example request: 
http://localhost:6927/sv.wikipedia.org/v1/page/featured/2016/10/11
I get:
...
{"parse": {"title": "API","pageid": 5657,"text": {"*": "<p><a 
href=\"/w/index.php?title=Mall:Utvald_artikel/2016-10-11&amp;action=edit&amp;redlink=1\"
 class=\"new\" title=\"Mall:Utvald artikel/2016-10-11 [inte skriven 
än]\">Mall:Utvald artikel/2016-10-11</a></p>\n\n"}}}

Looks like the page doesn't exist.

Change-Id: Ia6e46f0bef879df06114cbb0a5ec2b6f93d56a40
---
M lib/feed/featured.js
M lib/mwapi.js
2 files changed, 143 insertions(+), 30 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/mobileapps 
refs/changes/01/316501/1

diff --git a/lib/feed/featured.js b/lib/feed/featured.js
index 11c05c4..982a9ac 100644
--- a/lib/feed/featured.js
+++ b/lib/feed/featured.js
@@ -6,8 +6,9 @@
 
 var preq = require('preq');
 var api = require('../api-util');
-var mwapi = require('../mwapi');
+var domino = require('domino');
 var dateUtil = require('../dateUtil');
+var mwapi = require('../mwapi');
 var sUtil = require('../util');
 var BBPromise = require('bluebird');
 var HTTPError = sUtil.HTTPError;
@@ -21,7 +22,7 @@
  * @param {Date} date for which day the featured article is requested
  * @return {Promise} a promise resolving as an JSON object containing the 
response
  */
-function requestFeaturedArticleTitle(app, domain, date) {
+function requestEnglishFeaturedArticleTitle(app, domain, date) {
     var formattedDateString = dateUtil.formatDateEnglish(date);
     return api.mwApiGet(app, domain, {
         action: 'query',
@@ -29,9 +30,28 @@
         formatversion: 2,
         exchars: 255,
         explaintext: '',
-        titles: `Template:TFA_title/${formattedDateString}`,
-        prop: 'extracts'
+        prop: 'extracts',
+        titles: `Template:TFA_title/${formattedDateString}`
     });
+}
+
+/**
+ * Builds the request to get the Featured article of a given date.
+ *
+ * @param {Object} app the application object
+ * @param {Object} req the request object
+ * @return {Promise} a promise resolving as an JSON object containing the 
response
+ */
+function requestSwedishFeaturedArticleTitle(app, req) {
+    var formattedDateString = dateUtil.hyphenDelimitedDateString(req);
+    var text = `{{Utvald artikel/${formattedDateString}}}`;
+    return api.mwApiGet(app, req.params.domain, {
+        action: 'parse',
+        format: 'json',
+        prop: 'text',
+        contentmodel: 'wikitext',
+        text: text
+    }, true);
 }
 
 // -- functions dealing with responses:
@@ -60,6 +80,30 @@
     }
 }
 
+function getParseObject(response, dontThrow) {
+    if (response.body.parse) {
+        var parse = response.body.parse;
+        if (!parse.text) {
+            throw new HTTPError({
+                status: 404,
+                type: 'not_found',
+                title: 'No featured article for this date',
+                detail: 'There is no featured article for this date.'
+            });
+        }
+        return parse;
+    } else {
+        if (!dontThrow) {
+            throw new HTTPError({
+                status: 500,
+                type: 'unknown_backend_response',
+                title: 'Unexpected backend response',
+                detail: 'The backend responded with gibberish.'
+            });
+        }
+    }
+}
+
 /**
  * HAX: TextExtracts extension will (sometimes) add "..." to the extract.  In 
this particular case, we don't
  * want it, so we remove it if present.
@@ -69,6 +113,78 @@
         return extract.slice(0, -3);
     }
     return extract;
+}
+
+/**
+ * Removes extra HTML tags and trim whitespace from a string.
+ */
+function flattenHtml(text) {
+    var doc = domino.createDocument();
+    var node = doc.createElement('div');
+    node.innerHTML = text;
+    return node.textContent.trim();
+}
+
+/**
+ * Gets the TITLE from "<p>Wikipedia:Utvald artikel/TITLE</p>\n\n"
+ */
+function removeSwedishTemplateName(text) {
+    console.log('removeSwedishTemplateName ' + text);
+    return flattenHtml(text).replace('Wikipedia:Utvald artikel/', '');
+}
+
+function unsupported(aggregated) {
+    if (aggregated) {
+        return BBPromise.resolve({});
+    } else {
+        throw new HTTPError({
+            status: 501,
+            type: 'unsupported_language',
+            title: 'Language not supported',
+            detail: 'The language you have requested is not yet supported.'
+        });
+    }
+}
+
+function englishTFA(app, req, aggregated) {
+    var tfaPageObj, pageTitle;
+
+    return requestEnglishFeaturedArticleTitle(app, req.params.domain, 
dateUtil.getRequestedDate(req))
+        .then(function (response) {
+            mwapi.checkForQueryPagesInResponse(req, response);
+            tfaPageObj = getPageObject(response);
+            pageTitle = removeEllipsis(tfaPageObj.extract);
+            return BBPromise.props({
+                dbTitle: mwapi.getDbTitle(app, req, pageTitle)
+            });
+        }).then(function (res) {
+            return {
+                payload: { title: res.dbTitle },
+                meta: { etag: tfaPageObj.pageid }
+            };
+        });
+}
+
+function swedishTFA(app, req, aggregated) {
+    var tfaParseObj, pageTitle;
+
+    return requestSwedishFeaturedArticleTitle(app, req)
+        .then(function (response) {
+            console.log("response = " + JSON.stringify(response, null, 2));
+            mwapi.checkForParseObjectInResponse(req, response);
+            tfaParseObj = getParseObject(response);
+            console.log("tfaParseObj = " + JSON.stringify(tfaParseObj, null, 
2));
+            pageTitle = removeSwedishTemplateName(tfaParseObj.text['*']);
+            console.log('pageTitle ' + pageTitle);
+            return BBPromise.props({
+                dbTitle: mwapi.getDbTitle(app, req, pageTitle)
+            });
+        }).then(function (res) {
+            return {
+                payload: { title: res.dbTitle },
+                meta: { etag: tfaParseObj.pageid }
+            };
+        });
 }
 
 function promise(app, req) {
@@ -81,35 +197,19 @@
         dateUtil.throwDateError();
     }
 
-    if (req.params.domain.indexOf('en') !== 0 || 
req.params.domain.indexOf('beta.wmflabs.org') > 0) {
-        if (aggregated) {
-            return BBPromise.resolve({});
-        } else {
-            throw new HTTPError({
-                status: 501,
-                type: 'unsupported_language',
-                title: 'Language not supported',
-                detail: 'The language you have requested is not yet supported.'
-            });
-        }
+    if (req.params.domain.indexOf('beta.wmflabs.org/') > 0) {
+        return unsupported(aggregated);
     }
 
-    var tfaPageObj, pageTitle;
+    if (req.params.domain.indexOf('en.') === 0) {
+        return englishTFA(app, req, aggregated);
+    }
 
-    return requestFeaturedArticleTitle(app, req.params.domain, 
dateUtil.getRequestedDate(req))
-    .then(function (response) {
-        mwapi.checkForQueryPagesInResponse(req, response);
-        tfaPageObj = getPageObject(response);
-        pageTitle = removeEllipsis(tfaPageObj.extract);
-        return BBPromise.props({
-            dbTitle: mwapi.getDbTitle(app, req, pageTitle)
-        });
-    }).then(function (res) {
-        return {
-            payload: { title: res.dbTitle },
-            meta: { etag: tfaPageObj.pageid }
-        };
-    });
+    if (req.params.domain.indexOf('sv.') === 0) {
+        return swedishTFA(app, req, aggregated);
+    }
+
+    return unsupported(aggregated);
 }
 
 module.exports = {
diff --git a/lib/mwapi.js b/lib/mwapi.js
index 842f41a..bfcdacb 100644
--- a/lib/mwapi.js
+++ b/lib/mwapi.js
@@ -66,6 +66,19 @@
     }
 };
 
+mwapi.checkForParseObjectInResponse = function(req, response) {
+    if (!(response && response.body && response.body.parse)) {
+        // we did not get our expected parse from the MW API, propagate that
+        req.logger.log('error/mwapi', 'no parse object in response');
+        throw new HTTPError({
+            status: 504,
+            type: 'api_error',
+            title: 'no parse object in response',
+            detail: response.body
+        });
+    }
+};
+
 // copied from restbase/lib/mwUtil.js
 mwapi.findSharedRepoDomain = function(siteInfoRes) {
     var sharedRepo = (siteInfoRes.body.query.repos || []).find(function(repo) {

-- 
To view, visit https://gerrit.wikimedia.org/r/316501
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia6e46f0bef879df06114cbb0a5ec2b6f93d56a40
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/mobileapps
Gerrit-Branch: master
Gerrit-Owner: BearND <bsitzm...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to