Статьи

Windows 8 HTML5 Metro Style App: программа чтения RSS за 30 минут — Создание версии WordPress или сервера сообщества

Windows 8 HTML5 Metro Style App: как создать маленькую программу для чтения RSS за 30 минут (часть 1/2)
Windows 8 HTML5 Metro Style App: Как создать маленькую программу для чтения RSS за 30 минут (часть 2/2)

Но многие из вас отправляли мне электронные письма или сообщения в Twitter, чтобы узнать, как включить учебники в блог WordPress . Итак, позвольте мне показать вам, как сделать это за 5 минут, а не давать вам код напрямую.Clignement d'œil 

Вам, конечно, нужно прочитать 2 предыдущих урока, прежде чем проходить этот. Более того, обратите внимание еще раз, что приведенных ниже сведений будет недостаточно, чтобы подготовить отличное приложение для Windows 8 для магазина . Вот почему я также продолжу эту серию в ближайшие недели, чтобы показать вам, как добавить каркас навигации, заставку, представление моментальных снимков и т. Д.

Обновление от 09/07/2012: я также добавил пример использования RSS-канала Сервера совместной работы (в моем блоге), так как у меня также были запросы по этому поводу. Если у вас есть другой тип платформы блогов, просто следуйте принципам, описанным ниже, чтобы найти соответствие между вашей структурой XML и кодом JS.

Хорошо, давайте начнем с рассмотрения того, что вам нужно изменить в первой части учебников, чтобы соответствовать RSS-каналу, отправляемому блогом WordPress или сервером совместной работы.

Для WordPress давайте перейдем на официальный сайт WordPress: http://wordpress.com/ и попробуем некоторые из предложенных блогов. Я случайно выбрал этот: Wax Wane и его RSS-канал: Wax Wane RSS Feed .

Для Сервера совместной работы, давайте использовать мой собственный RSS-канал блога: http://blogs.msdn.com/b/davrous/rss.aspx

Что нам нужно сделать, так это проанализировать содержимое XML, отправленное обратно через RSS-канал, и найти интересующие нас узлы, чтобы изменить эту предыдущую функцию загрузки:

function downloadC9BlogFeed() {
    WinJS.xhr({ url: "http://channel9.msdn.com/coding4fun/articles/RSS" }).then(function (rss) {
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("thumbnail");
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[1].attributes.getNamedItem("url").textContent;
                article.content = items[n].textContent;
                articlesList.push(article);
            }
        }
    });
}

это было сделано для правильной работы с деревом XML канала RSS блога Channel9.

Просмотрите RSS-канал WordPress и / или версию Сервера совместной работы в своем браузере:

образ образ

И щелкните правой кнопкой мыши, чтобы просмотреть источник. Он, вероятно, откроет его в блокноте, который не является лучшим инструментом для просмотра XML. Скопируйте / вставьте весь XML-канал в новый XML-файл в Visual Studio 2012:

образ

Изучив ленту WordPress или Сервера сообщества, вы заметите, что атрибут «thumbnail» отсутствует, как у нас в канале Channel9.

Примечание: первое простое решение было бы тогда иметь ту же структуру XML, что и Channel9, используя плагин MediaRSS для WordPress . Но давайте посмотрим на более общий подход.

Начнем с версии WordPress. Интересные части XML хранятся в:

— « <content: encoded> » для самой статьи
— « <media: content> » для возможных изображений, которые можно использовать в качестве миниатюр для главной страницы.

Получается, что последний узел <media: content> в списке работает нормально. Чтобы отразить это, вот функция загрузки, которую я предлагаю вам:

function downloadThisWordPressBlogFeed(WPFeedUrl) {
    WinJS.xhr({ url: WPFeedUrl }).then(function (rss) {
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("content");
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[thumbs.length - 1].attributes.getNamedItem("url").textContent;
                article.content = items[n].querySelector("encoded").textContent;
                articlesList.push(article);
            }
        }
    });
}

 Затем вам нужно вызвать эту функцию вместо предыдущей и передать в качестве параметра URL-адрес канала вашего блога. Например:

args.setPromise(WinJS.UI.processAll().then(downloadThisWordPressBlogFeed("http://wax-wane.com/feed/")));

Если вы работаете с этими модификациями, он начнет работать:

образ образ

Чтобы немного улучшить опыт, давайте добавим заголовок текущего блога, который читается в заголовке домашней страницы, и давайте отобразим заголовок статьи вверху при переходе к нему. Для этого объявите эти переменные в начале « default.js »:

var wordPressBlogTitle;
var mainTitle;

В отключенной функции найдите div, связанный с основным заголовком:

mainTitle = document.getElementById("maintitle");

Затем измените функцию загрузки, добавив эти 2 дополнительные строки:

function downloadThisWordPressBlogFeed(WPFeedUrl) {
    WinJS.xhr({ url: WPFeedUrl }).then(function (rss) {
        wordPressBlogTitle = rss.responseXML.querySelector("title").textContent;
        mainTitle.innerHTML = "Welcome to " + wordPressBlogTitle + " blog!";
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("content");
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[thumbs.length - 1].attributes.getNamedItem("url").textContent;
                article.content = items[n].querySelector("encoded").textContent;
                articlesList.push(article);
            }
        }
    });
}

Наконец, измените логику навигации, чтобы добавить эти строки в соответствующие функции:

function backButtonClick(e) {
    articlecontent.style.display = "none";
    articlelist.style.display = "";
    mainTitle.innerHTML = "Welcome to " + wordPressBlogTitle + " blog!";
    WinJS.UI.Animation.enterPage(articlelist);
}

function itemInvoked(e) {
    var currentArticle = articlesList.getAt(e.detail.itemIndex);
    WinJS.Utilities.setInnerHTMLUnsafe(articlecontent, currentArticle.content);
    articlelist.style.display = "none";
    articlecontent.style.display = "";
    mainTitle.innerHTML = currentArticle.title;
    WinJS.UI.Animation.enterPage(articlecontent);
}

 

Вот и все. Запуск приложения в Wax Wane RSS Feed даст вам следующие результаты:

образ образ

Вам, вероятно, придется использовать Blend для работы над дизайном вашего блога, чтобы получить лучшие результаты.

Наконец, во время тестирования этого решения я обнаружил, что URL-адреса некоторых блогов, которые некоторые из вас прислали мне, не работают с приведенным выше кодом. Это связано с тем, что в их каналах нет узлов <media: content>. Та же проблема для фида Сервера совместной работы. Сам контент хранится внутри узла <description>, и, по крайней мере, для тех версий Technet и MSDN, которые у нас есть, нет узлов <media: content>, которые мы могли бы использовать в качестве базы для своих миниатюр.

Возможным альтернативным решением будет поиск первого доступного URL-адреса изображения в самой записи блога и использование его в качестве эскиза.

Вот предлагаемое возможное решение для WordPress:

function downloadThisWordPressBlogFeed(WPFeedUrl) {
    WinJS.xhr({ url: WPFeedUrl }).then(function (rss) {
        wordPressBlogTitle = rss.responseXML.querySelector("title").textContent;
        mainTitle.innerHTML = "Welcome to " + wordPressBlogTitle + " blog!";
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("content");
            article.content = items[n].querySelector("encoded").textContent;
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[thumbs.length - 1].attributes.getNamedItem("url").textContent;
            }
            else {
                var firstindex = article.content.indexOf("<img");
                if (firstindex !== -1) {
                    var secondindex = article.content.indexOf("src=", firstindex) + 5;
                    var thirdindex = article.content.indexOf("\"", secondindex);
                    article.thumbnail = article.content.slice(secondindex, thirdindex);
                }
            }

            if (article.thumbnail) {
                articlesList.push(article);
            }
        }
    });
}

И вот предлагаемое возможное решение для Сервера совместной работы:

function downloadThisCommunityServerBlogFeed(WPFeedUrl) {
    WinJS.xhr({ url: WPFeedUrl }).then(function (rss) {
        wordPressBlogTitle = rss.responseXML.querySelector("title").textContent;
        mainTitle.innerHTML = "Welcome to " + wordPressBlogTitle + " blog!";
        var items = rss.responseXML.querySelectorAll("item");

        for (var n = 0; n < items.length; n++) {
            var article = {};
            article.title = items[n].querySelector("title").textContent;
            var thumbs = items[n].querySelectorAll("content");
            article.content = items[n].querySelector("description").textContent;
            if (thumbs.length > 1) {
                article.thumbnail = thumbs[thumbs.length - 1].attributes.getNamedItem("url").textContent;
            }
            else {
                var firstindex = article.content.indexOf("<img");
                if (firstindex !== -1) {
                    var secondindex = article.content.indexOf("src=", firstindex) + 5;
                    var thirdindex = article.content.indexOf("\"", secondindex);
                    article.thumbnail = article.content.slice(secondindex, thirdindex);
                }
            }

            if (article.thumbnail) {
                articlesList.push(article);
            }
        }
    });
}

Вы заметите, что единственное отличие состоит в том, что имя узла XML, содержащего содержимое статьи на сервере совместной работы, — «<описание>», тогда как для «WordPress» это «<контент: кодированный>».

Этот код недостаточно надежен для рассмотрения всех возможных случаев, поэтому вам, вероятно, придется поработать над этой частью для своего собственного блога. Тем не менее, это решение отлично работает в различных случаях, например, в этом блоге, посвященном Super Heros: http://comicsgen.fr/feed :

образ

И вот результат с моего собственного блога:

образ образ

Опять же, дизайн далеко не оптимален. Поскольку я выбираю первое изображение в качестве эскиза, оно не всегда подходит или недостаточно качественно. Вы можете подумать об улучшении этой части, выбрав в канале изображение наилучшего качества или пометив одно из изображений определенным классом, чтобы автоматически извлечь его в код JS в качестве эскиза. Тем не менее, вы заметите, что видео в моих постах блогов работают нормально, поскольку они используют… HTML5 <video>!Sourire 

Итак, у нас уже есть хорошее работающее приложение в нескольких строках HTML5 / CSS3 / JS-кода. Теперь вы должны собрать все основные элементы для создания собственного приложения Windows 8, подключенного к вашему RSS-каналу WordPress или Community Server.

Вы можете скачать решение Visual Studio 2012 здесь: Basic Generic WordPress Metro Reader

Наслаждайтесь!