Skip to content

Instantly share code, notes, and snippets.

@h5y1m141
Created October 15, 2012 00:44
Show Gist options
  • Save h5y1m141/3890304 to your computer and use it in GitHub Desktop.
Save h5y1m141/3890304 to your computer and use it in GitHub Desktop.
QiitaのiPhoneアプリをTitaniumMobile+CoffeeScript
Qiita = require('qiita')
tableView = require('tableView')
moment = require('lib/moment.min')
momentja = require('lib/momentja')
t = new tableView()
q = new Qiita()
token = Ti.App.Properties.getString('QiitaToken')
if token is null
q._auth()
Ti.API.info('Token is' + token)
win1 = Ti.UI.createWindow
title:'Qiita'
barColor:'#59BB0C'
actInd = Ti.UI.createActivityIndicator
zIndex:10
top:100
left: 120
height: 40
width: 'auto'
font:
fontFamily:'Helvetica Neue'
fontSize:15
fontWeight:'bold'
color: '#fff'
message: 'loading...'
actInd.show()
win1.add(actInd)
mainTable = t.getTable()
rows = []
q.getFeed( (result,links) ->
for link in links
if link["rel"] == 'next'
Ti.App.Properties.setString('nextPageURL',link["url"])
rows.push(t.createRow(json)) for json in result
rows.push(t.createRowForLoadOldEntry())
mainTable.setData(rows)
actInd.hide()
win1.add(mainTable)
return true
)
tg = Ti.UI.createTabGroup()
tab = Ti.UI.createTab
window: win1
tg.addTab(tab)
tg.open()
// moment.js
// version : 1.7.2
// author : Tim Wood
// license : MIT
// momentjs.com
(function(a){function E(a,b,c,d){var e=c.lang();return e[a].call?e[a](c,d):e[a][b]}function F(a,b){return function(c){return K(a.call(this,c),b)}}function G(a){return function(b){var c=a.call(this,b);return c+this.lang().ordinal(c)}}function H(a,b,c){this._d=a,this._isUTC=!!b,this._a=a._a||null,this._lang=c||!1}function I(a){var b=this._data={},c=a.years||a.y||0,d=a.months||a.M||0,e=a.weeks||a.w||0,f=a.days||a.d||0,g=a.hours||a.h||0,h=a.minutes||a.m||0,i=a.seconds||a.s||0,j=a.milliseconds||a.ms||0;this._milliseconds=j+i*1e3+h*6e4+g*36e5,this._days=f+e*7,this._months=d+c*12,b.milliseconds=j%1e3,i+=J(j/1e3),b.seconds=i%60,h+=J(i/60),b.minutes=h%60,g+=J(h/60),b.hours=g%24,f+=J(g/24),f+=e*7,b.days=f%30,d+=J(f/30),b.months=d%12,c+=J(d/12),b.years=c,this._lang=!1}function J(a){return a<0?Math.ceil(a):Math.floor(a)}function K(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}function L(a,b,c){var d=b._milliseconds,e=b._days,f=b._months,g;d&&a._d.setTime(+a+d*c),e&&a.date(a.date()+e*c),f&&(g=a.date(),a.date(1).month(a.month()+f*c).date(Math.min(g,a.daysInMonth())))}function M(a){return Object.prototype.toString.call(a)==="[object Array]"}function N(a,b){var c=Math.min(a.length,b.length),d=Math.abs(a.length-b.length),e=0,f;for(f=0;f<c;f++)~~a[f]!==~~b[f]&&e++;return e+d}function O(a,b,c,d){var e,f,g=[];for(e=0;e<7;e++)g[e]=a[e]=a[e]==null?e===2?1:0:a[e];return a[7]=g[7]=b,a[8]!=null&&(g[8]=a[8]),a[3]+=c||0,a[4]+=d||0,f=new Date(0),b?(f.setUTCFullYear(a[0],a[1],a[2]),f.setUTCHours(a[3],a[4],a[5],a[6])):(f.setFullYear(a[0],a[1],a[2]),f.setHours(a[3],a[4],a[5],a[6])),f._a=g,f}function P(a,c){var d,e,g=[];!c&&h&&(c=require("./lang/"+a));for(d=0;d<i.length;d++)c[i[d]]=c[i[d]]||f.en[i[d]];for(d=0;d<12;d++)e=b([2e3,d]),g[d]=new RegExp("^"+(c.months[d]||c.months(e,""))+"|^"+(c.monthsShort[d]||c.monthsShort(e,"")).replace(".",""),"i");return c.monthsParse=c.monthsParse||g,f[a]=c,c}function Q(a){var c=typeof a=="string"&&a||a&&a._lang||null;return c?f[c]||P(c):b}function R(a){return a.match(/\[.*\]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function S(a){var b=a.match(k),c,d;for(c=0,d=b.length;c<d;c++)D[b[c]]?b[c]=D[b[c]]:b[c]=R(b[c]);return function(e){var f="";for(c=0;c<d;c++)f+=typeof b[c].call=="function"?b[c].call(e,a):b[c];return f}}function T(a,b){function d(b){return a.lang().longDateFormat[b]||b}var c=5;while(c--&&l.test(b))b=b.replace(l,d);return A[b]||(A[b]=S(b)),A[b](a)}function U(a){switch(a){case"DDDD":return p;case"YYYY":return q;case"S":case"SS":case"SSS":case"DDD":return o;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":case"a":case"A":return r;case"Z":case"ZZ":return s;case"T":return t;case"MM":case"DD":case"YY":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":return n;default:return new RegExp(a.replace("\\",""))}}function V(a,b,c,d){var e,f;switch(a){case"M":case"MM":c[1]=b==null?0:~~b-1;break;case"MMM":case"MMMM":for(e=0;e<12;e++)if(Q().monthsParse[e].test(b)){c[1]=e,f=!0;break}f||(c[8]=!1);break;case"D":case"DD":case"DDD":case"DDDD":b!=null&&(c[2]=~~b);break;case"YY":c[0]=~~b+(~~b>70?1900:2e3);break;case"YYYY":c[0]=~~Math.abs(b);break;case"a":case"A":d.isPm=(b+"").toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":c[3]=~~b;break;case"m":case"mm":c[4]=~~b;break;case"s":case"ss":c[5]=~~b;break;case"S":case"SS":case"SSS":c[6]=~~(("0."+b)*1e3);break;case"Z":case"ZZ":d.isUTC=!0,e=(b+"").match(x),e&&e[1]&&(d.tzh=~~e[1]),e&&e[2]&&(d.tzm=~~e[2]),e&&e[0]==="+"&&(d.tzh=-d.tzh,d.tzm=-d.tzm)}b==null&&(c[8]=!1)}function W(a,b){var c=[0,0,1,0,0,0,0],d={tzh:0,tzm:0},e=b.match(k),f,g;for(f=0;f<e.length;f++)g=(U(e[f]).exec(a)||[])[0],g&&(a=a.slice(a.indexOf(g)+g.length)),D[e[f]]&&V(e[f],g,c,d);return d.isPm&&c[3]<12&&(c[3]+=12),d.isPm===!1&&c[3]===12&&(c[3]=0),O(c,d.isUTC,d.tzh,d.tzm)}function X(a,b){var c,d=a.match(m)||[],e,f=99,g,h,i;for(g=0;g<b.length;g++)h=W(a,b[g]),e=T(new H(h),b[g]).match(m)||[],i=N(d,e),i<f&&(f=i,c=h);return c}function Y(a){var b="YYYY-MM-DDT",c;if(u.exec(a)){for(c=0;c<4;c++)if(w[c][1].exec(a)){b+=w[c][0];break}return s.exec(a)?W(a,b+" Z"):W(a,b)}return new Date(a)}function Z(a,b,c,d,e){var f=e.relativeTime[a];return typeof f=="function"?f(b||1,!!c,a,d):f.replace(/%d/i,b||1)}function $(a,b,c){var e=d(Math.abs(a)/1e3),f=d(e/60),g=d(f/60),h=d(g/24),i=d(h/365),j=e<45&&["s",e]||f===1&&["m"]||f<45&&["mm",f]||g===1&&["h"]||g<22&&["hh",g]||h===1&&["d"]||h<=25&&["dd",h]||h<=45&&["M"]||h<345&&["MM",d(h/30)]||i===1&&["y"]||["yy",i];return j[2]=b,j[3]=a>0,j[4]=c,Z.apply({},j)}function _(a,c){b.fn[a]=function(a){var b=this._isUTC?"UTC":"";return a!=null?(this._d["set"+b+c](a),this):this._d["get"+b+c]()}}function ab(a){b.duration.fn[a]=function(){return this._data[a]}}function bb(a,c){b.duration.fn["as"+a]=function(){return+this/c}}var b,c="1.7.2",d=Math.round,e,f={},g="en",h=typeof module!="undefined"&&module.exports,i="months|monthsShort|weekdays|weekdaysShort|weekdaysMin|longDateFormat|calendar|relativeTime|ordinal|meridiem".split("|"),j=/^\/?Date\((\-?\d+)/i,k=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|SS?S?|zz?|ZZ?|.)/g,l=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?)/g,m=/([0-9a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)/gi,n=/\d\d?/,o=/\d{1,3}/,p=/\d{3}/,q=/\d{1,4}/,r=/[0-9a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+/i,s=/Z|[\+\-]\d\d:?\d\d/i,t=/T/i,u=/^\s*\d{4}-\d\d-\d\d(T(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/,v="YYYY-MM-DDTHH:mm:ssZ",w=[["HH:mm:ss.S",/T\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/T\d\d:\d\d:\d\d/],["HH:mm",/T\d\d:\d\d/],["HH",/T\d\d/]],x=/([\+\-]|\d\d)/gi,y="Month|Date|Hours|Minutes|Seconds|Milliseconds".split("|"),z={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},A={},B="DDD w M D d".split(" "),C="M D H h m s w".split(" "),D={M:function(){return this.month()+1},MMM:function(a){return E("monthsShort",this.month(),this,a)},MMMM:function(a){return E("months",this.month(),this,a)},D:function(){return this.date()},DDD:function(){var a=new Date(this.year(),this.month(),this.date()),b=new Date(this.year(),0,1);return~~((a-b)/864e5+1.5)},d:function(){return this.day()},dd:function(a){return E("weekdaysMin",this.day(),this,a)},ddd:function(a){return E("weekdaysShort",this.day(),this,a)},dddd:function(a){return E("weekdays",this.day(),this,a)},w:function(){var a=new Date(this.year(),this.month(),this.date()-this.day()+5),b=new Date(a.getFullYear(),0,4);return~~((a-b)/864e5/7+1.5)},YY:function(){return K(this.year()%100,2)},YYYY:function(){return K(this.year(),4)},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return~~(this.milliseconds()/100)},SS:function(){return K(~~(this.milliseconds()/10),2)},SSS:function(){return K(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return a<0&&(a=-a,b="-"),b+K(~~(a/60),2)+":"+K(~~a%60,2)},ZZ:function(){var a=-this.zone(),b="+";return a<0&&(a=-a,b="-"),b+K(~~(10*a/6),4)}};while(B.length)e=B.pop(),D[e+"o"]=G(D[e]);while(C.length)e=C.pop(),D[e+e]=F(D[e],2);D.DDDD=F(D.DDD,3),b=function(c,d){if(c===null||c==="")return null;var e,f;return b.isMoment(c)?new H(new Date(+c._d),c._isUTC,c._lang):(d?M(d)?e=X(c,d):e=W(c,d):(f=j.exec(c),e=c===a?new Date:f?new Date(+f[1]):c instanceof Date?c:M(c)?O(c):typeof c=="string"?Y(c):new Date(c)),new H(e))},b.utc=function(a,c){return M(a)?new H(O(a,!0),!0):(typeof a=="string"&&!s.exec(a)&&(a+=" +0000",c&&(c+=" Z")),b(a,c).utc())},b.unix=function(a){return b(a*1e3)},b.duration=function(a,c){var d=b.isDuration(a),e=typeof a=="number",f=d?a._data:e?{}:a,g;return e&&(c?f[c]=a:f.milliseconds=a),g=new I(f),d&&(g._lang=a._lang),g},b.humanizeDuration=function(a,c,d){return b.duration(a,c===!0?null:c).humanize(c===!0?!0:d)},b.version=c,b.defaultFormat=v,b.lang=function(a,c){var d;if(!a)return g;(c||!f[a])&&P(a,c);if(f[a]){for(d=0;d<i.length;d++)b[i[d]]=f[a][i[d]];b.monthsParse=f[a].monthsParse,g=a}},b.langData=Q,b.isMoment=function(a){return a instanceof H},b.isDuration=function(a){return a instanceof I},b.lang("en",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"}}),b.fn=H.prototype={clone:function(){return b(this)},valueOf:function(){return+this._d},unix:function(){return Math.floor(+this._d/1e3)},toString:function(){return this._d.toString()},toDate:function(){return this._d},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds(),!!this._isUTC]},isValid:function(){return this._a?this._a[8]!=null?!!this._a[8]:!N(this._a,(this._a[7]?b.utc(this._a):b(this._a)).toArray()):!isNaN(this._d.getTime())},utc:function(){return this._isUTC=!0,this},local:function(){return this._isUTC=!1,this},format:function(a){return T(this,a?a:b.defaultFormat)},add:function(a,c){var d=c?b.duration(+c,a):b.duration(a);return L(this,d,1),this},subtract:function(a,c){var d=c?b.duration(+c,a):b.duration(a);return L(this,d,-1),this},diff:function(a,c,e){var f=this._isUTC?b(a).utc():b(a).local(),g=(this.zone()-f.zone())*6e4,h=this._d-f._d-g,i=this.year()-f.year(),j=this.month()-f.month(),k=this.date()-f.date(),l;return c==="months"?l=i*12+j+k/30:c==="years"?l=i+(j+k/30)/12:l=c==="seconds"?h/1e3:c==="minutes"?h/6e4:c==="hours"?h/36e5:c==="days"?h/864e5:c==="weeks"?h/6048e5:h,e?l:d(l)},from:function(a,c){return b.duration(this.diff(a)).lang(this._lang).humanize(!c)},fromNow:function(a){return this.from(b(),a)},calendar:function(){var a=this.diff(b().sod(),"days",!0),c=this.lang().calendar,d=c.sameElse,e=a<-6?d:a<-1?c.lastWeek:a<0?c.lastDay:a<1?c.sameDay:a<2?c.nextDay:a<7?c.nextWeek:d;return this.format(typeof e=="function"?e.apply(this):e)},isLeapYear:function(){var a=this.year();return a%4===0&&a%100!==0||a%400===0},isDST:function(){return this.zone()<b([this.year()]).zone()||this.zone()<b([this.year(),5]).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return a==null?b:this.add({d:a-b})},startOf:function(a){switch(a.replace(/s$/,"")){case"year":this.month(0);case"month":this.date(1);case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return this},endOf:function(a){return this.startOf(a).add(a.replace(/s?$/,"s"),1).subtract("ms",1)},sod:function(){return this.clone().startOf("day")},eod:function(){return this.clone().endOf("day")},zone:function(){return this._isUTC?0:this._d.getTimezoneOffset()},daysInMonth:function(){return b.utc([this.year(),this.month()+1,0]).date()},lang:function(b){return b===a?Q(this):(this._lang=b,this)}};for(e=0;e<y.length;e++)_(y[e].toLowerCase(),y[e]);_("year","FullYear"),b.duration.fn=I.prototype={weeks:function(){return J(this.days()/7)},valueOf:function(){return this._milliseconds+this._days*864e5+this._months*2592e6},humanize:function(a){var b=+this,c=this.lang().relativeTime,d=$(b,!a,this.lang()),e=b<=0?c.past:c.future;return a&&(typeof e=="function"?d=e(d):d=e.replace(/%s/i,d)),d},lang:b.fn.lang};for(e in z)z.hasOwnProperty(e)&&(bb(e,z[e]),ab(e.toLowerCase()));bb("Weeks",6048e5),h&&(module.exports=b),typeof ender=="undefined"&&(this.moment=b),typeof define=="function"&&define.amd&&define("moment",[],function(){return b})}).call(this);
// moment.js
// version : 1.7.0
// author : Tim Wood
// license : MIT
// momentjs.com
// moment.lang_ja.js
// このスクリプトは moment.js の表示文言部分を日本語でオーバーライドしたものです。
// ライセンスは本家を継承します。
// 本家moment.jsのあとに呼んでください。
// 例:
// <script src="moment.js"></script>
// <script src="moment.lang_ja.js"></script>
// 作成者:佐藤 毅 (株式会社ジーティーアイ http://gti.jp )
moment.lang('ja', {
// months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
// monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),
// weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
weekdays : "日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),
// weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
weekdaysShort : "(日)_(月)_(火)_(水)_(木)_(金)_(土)".split("_"),
// weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
weekdaysMin : "日_月_火_水_木_金_土".split("_"),
longDateFormat : {
LT : "h:mm A",
L : "MM/DD/YYYY",
LL : "MMMM D YYYY",
LLL : "MMMM D YYYY LT",
LLLL : "dddd, MMMM D YYYY LT"
},
meridiem : function (hours, minutes, isLower) {
if (hours > 11) {
return isLower ? 'pm' : 'PM';
} else {
return isLower ? 'am' : 'AM';
}
},
calendar : {
sameDay : '[Today at] LT',
nextDay : '[Tomorrow at] LT',
nextWeek : 'dddd [at] LT',
lastDay : '[Yesterday at] LT',
lastWeek : '[last] dddd [at] LT',
sameElse : 'L'
},
relativeTime : {
future : "%s後",
past : "%s前",
// s : "a few seconds",
s : "ちょっと",
// m : "a minute",
m : "約1分",
// mm : "%d minutes",
mm : "%d分",
// h : "an hour",
h : "約1時間",
// hh : "%d hours",
hh : "%d時間",
// d : "a day",
d : "1日",
// dd : "%d days",
dd : "%d日",
// M : "a month",
M : "1ヶ月",
// MM : "%d months",
MM : "%dヶ月",
// y : "a year",
y : "1年",
// yy : "%d years"
yy : "%d年"
},
ordinal : function (number) {
var b = number % 10;
return (~~ (number % 100 / 10) === 1) ? 'th' :
(b === 1) ? 'st' :
(b === 2) ? 'nd' :
(b === 3) ? 'rd' : 'th';
}
});
class Qiita
constructor: (@name) ->
@version = 1.0
@user_name = 'h5y1m141@github'
@parameter =
stocks:
url:"https://qiita.com/api/v1/users/#{@user_name}/stocks"
method:'GET'
myStocks:
url:"https://qiita.com/api/v1/stocks"
method:'GET'
followingUsers:
url:"https://qiita.com/api/v1/users/#{@user_name}/following_users"
method:'GET'
followingTags:
url:"https://qiita.com/api/v1/users/#{@user_name}/following_tags"
method:'GET'
feed:
url:"https://qiita.com/api/v1/items"
method:'GET'
getVersion: ->
return @version
_auth:() ->
xhr = Ti.Network.createHTTPClient()
config =
url_name: @user_name
password:'PASSWORD'
xhr.open('POST','https://qiita.com/api/v1/auth')
xhr.onload = ->
body = JSON.parse(xhr.responseText)
Ti.App.Properties.setString('QiitaToken', body.token)
xhr.send(config)
return true
_request:(parameter,callback) ->
self = @
xhr = Ti.Network.createHTTPClient()
xhr.open(parameter.method,parameter.url)
xhr.onload = ->
responseHeaders = xhr.responseHeaders
relLink = self._convertLinkHeaderToJSON(responseHeaders.Link)
json = JSON.parse(xhr.responseText)
callback(json,relLink)
xhr.send()
# Qiita APIの仕様としてページネーションの情報は以下のような形式で
# レスポンスヘッダのLinkヘッダに含まれる
# <https://qiita.com/api/v1/items?page=2>; rel="next", <https://qiita.com/api/v1/items?page=315>; rel="last"
# この形式だと扱いづらいため[{"next":"http://..},{"last":"http://..}}]
# というJSON形式に変換するためのメソッド
_convertLinkHeaderToJSON:(value)->
json = []
links = value.match(/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g)
relValues = value.match(/first|prev|next|last/g)
length = links.length-1
for i in [0..length]
_obj =
"rel":relValues[i]
"url":links[i]
json.push(_obj)
return json
getStocks:(callback) ->
param = @parameter.stocks
@._request(param,callback)
getFollowingUsers: (callback) ->
param = @parameter.followingUsers
@._request(param,callback)
getFollowingTags: (callback) ->
param = @parameter.followingTags
@._request(param,callback)
getFeed:(callback) ->
param = @parameter.feed
@._request(param,callback)
getNextFeed:(url,callback) ->
param =
"url": url
"method":'GET'
@._request(param,callback)
getMyStocks:(callback) ->
token = Ti.App.Properties.getString('QiitaToken')
if token is null
@._auth()
param =
url:@parameter.myStocks.url + "?token=#{token}"
method:@parameter.myStocks.url
Ti.API.info(param.url)
@._request(param,callback)
getMyFeed:(callback) ->
token = Ti.App.Properties.getString('QiitaToken')
if token is null
@._auth()
param =
url:@parameter.myFeed.url + "?token=#{token}"
method:@parameter.myFeed.method
Ti.API.info(param.url)
@._request(param,callback)
module.exports = Qiita
class tableView
constructor: () ->
@table = Ti.UI.createTableView
backgroundColor:'#ededed'
separatorColor: '#999'
zIndex:2
width:320
left:0
top:0
getTable: ()->
@table.addEventListener('click',(e)->
# TableViewの一番下に、過去投稿を読み込むためのボタンを
# 配置しており、そのrowだけは投稿詳細画面に遷移させない
# 詳細画面にいくかどうかはrowのclassNameの値をチェックする
if e.rowData.className == 'entry'
webWindow = Ti.UI.createWindow
barColor:'#59BB0C'
webView = require('webView')
w = new webView()
container = w.create(e.rowData.data)
webWindow.add(c) for c in container
tab.open(webWindow)
else
Ti.API.info 'load old entry'
url = Ti.App.Properties.getString('nextPageURL')
Ti.API.info "NEXTPAGE:#{url}"
actInd.backgroundColor = '#222'
actInd.opacity = 0.8
actInd.show()
q.getNextFeed(url,(result,links) ->
for link in links
if link["rel"] == 'next'
Ti.App.Properties.setString('nextPageURL',link["url"])
for json in result
r = t.createRow(json)
lastIndex = t.lastRowIndex()
Ti.API.info lastIndex
t.insertRow(lastIndex,r)
actInd.hide()
)
)
return @table
insertRow: (index,row)->
@table.insertRowAfter(index,row,{animated:true})
return true
lastRowIndex: () ->
# TableViewの行から2を引くことで最後のRowのindexを取得してるが
# 理由は下記2点のため
# 1.Rowの一番下にボタンとなるものを配置しているのでその分のRowを無視するためマイナス1する
# 2.Rowの先頭は0から始まっているので、そのためにマイナス1する。
return @table.data[0].rows.length-2
createRow: (json) ->
row = Ti.UI.createTableViewRow
width:320
borderWidth:2
color:'#999'
borderColor:'#ededed',
height:100
createdDate = moment(json.created_at,"YYYY-MM-DD HH:mm:ss Z").fromNow()
updateTime = Ti.UI.createLabel
font:
fontSize:10
color:'#666'
right:0
top:5
width:60
height:15
text:createdDate
row.add(updateTime)
iconImage = Ti.UI.createImageView
width:40
height:40
top:5
left:5
image:json.user.profile_image_url
row.add(iconImage)
handleName = Ti.UI.createLabel
width:200
height:15
top:5
left:60
color:"#333"
font:
fontSize:12
fontWeight:'bold'
text:json.user.url_name + "が投稿しました"
row.add(handleName)
textLabel = Ti.UI.createLabel
width:240
height:20
top:25
left:60
color:'#4BA503'
font:
fontSize:16
fontWeight:'bold'
text:json.title
row.add(textLabel)
bodySummary = Ti.UI.createLabel
width:240
height:50
left:60
top:45
color:"#444"
font:
fontSize:12
text:json.body.replace(/<\/?[^>]+>/gi, "")
row.add(bodySummary)
row.data = json
row.className = 'entry'
return row
createRowForLoadOldEntry: () ->
nextPage = Ti.App.Properties.getString('nextPageURL')
Ti.API.info nextPage
row = Ti.UI.createTableViewRow
touchEnabled:false
width:320
height:30
borderWidth:2
backgroundColor:'#222',
borderColor:'#ededed',
selectedBackgroundColor:'#59BB0C'
textLabel = Ti.UI.createLabel
width:320
height:30
top:0
left:0
color:'#fff'
font:
fontSize:16
fontWeight:'bold'
text:'以前の投稿を読み込む',
textAlign:1
row.add(textLabel)
row.className = 'loadOldEntry'
row.url = nextPage
return row
module.exports = tableView
class webView
constructor: () ->
create:(json) ->
file = Titanium.Filesystem.getFile(Titanium.Filesystem.resourcesDirectory, 'bootstrap.min.css')
css = file.read();
htmlHeaderElement = '<html><head><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1"><style type="text/css">#{css}</style></head>'
web = Ti.UI.createWebView
top:80
left:0
zIndex:5
width:320
html:"#{htmlHeaderElement}#{json.body}</body></html>"
titleLabel = Ti.UI.createLabel
font:
fontWeight:'bold'
fontSize:16
color:'#fff'
top:10
left:80
width:220
height:50
text :json.title
dateLabel = Ti.UI.createLabel
font:
fontSize:12
textAlign:2
color:'#fff'
top:65
left:80
width:220
height:15
text :'投稿日:' + moment(json.created_at,"YYYY-MM-DD HH:mm:ss Z").fromNow()
iconIamge = Ti.UI.createImageView
left:5
top:10
borderWidth:1
borderColor:'#222'
borderRadius:5
width:50
height:50
image:json.user.profile_image_url
backgroundColor:'#cbcbcb'
webViewHeaderContainer = Ti.UI.createLabel
top:0
left:0
width:320
height:80
backgroundColor:'#141414'
webViewHeaderContainer.add(iconIamge)
webViewHeaderContainer.add(titleLabel)
webViewHeaderContainer.add(dateLabel)
container = []
container.push(webViewHeaderContainer)
container.push(web)
return container
module.exports = webView
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment