mobileesp_converted 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/README.md +18 -0
- data/Rakefile +16 -0
- data/convert_to_ruby.vim +236 -0
- data/java_source/UAgentInfo.java +1026 -0
- data/lib/mobileesp_converted/u_agent_info.rb +1086 -0
- data/lib/mobileesp_converted/version.rb +3 -0
- data/lib/mobileesp_converted.rb +5 -0
- data/mobileesp_converted.gemspec +24 -0
- data/spec/mobileesp_converted/u_agent_info_spec.rb +111 -0
- data/spec/spec_helper.rb +4 -0
- metadata +86 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# MobileESPConverted
|
2
|
+
|
3
|
+
This is a Ruby implementation of MobileESP library. It has been automatically
|
4
|
+
generated from Java source code from the
|
5
|
+
[official MobileESP repository](http://code.google.com/p/mobileesp/source/browse).
|
6
|
+
It is converted with a Vim script so the result looks sloppy, but it is
|
7
|
+
unit-tested to ensure it works OK.
|
8
|
+
|
9
|
+
MobileESP provides device type detection (tablet, mobile, etc.) based on HTTP
|
10
|
+
request headers.
|
11
|
+
|
12
|
+
|
13
|
+
## License and more info
|
14
|
+
|
15
|
+
I just converted the code to Ruby, the original author is Anthony Hand.
|
16
|
+
|
17
|
+
For licensing of MobileESP and more info see [MobileESP official site](http://mobileesp.com).
|
18
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
task :default => [:test]
|
6
|
+
|
7
|
+
desc "Download Java MobileESP source code to ./tmp directory."
|
8
|
+
task :download_source do
|
9
|
+
`mkdir -p java_source`
|
10
|
+
`cd java_source; wget http://mobileesp.googlecode.com/svn/Java/UAgentInfo.java`
|
11
|
+
end
|
12
|
+
|
13
|
+
Rake::TestTask.new do |t|
|
14
|
+
t.pattern = "spec/**/*_spec.rb"
|
15
|
+
end
|
16
|
+
|
data/convert_to_ruby.vim
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
" Vim script to convert MobileESP library from Java to Ruby
|
2
|
+
" Author: Jiri Stransky
|
3
|
+
" License: MIT
|
4
|
+
|
5
|
+
fun! s:ConvertToRuby()
|
6
|
+
set filetype=ruby
|
7
|
+
call s:TabsToSpaces()
|
8
|
+
call s:ConvertComments()
|
9
|
+
call s:FixTrailingSpaces()
|
10
|
+
call s:FixShorthandIfs()
|
11
|
+
call s:RemovePackage()
|
12
|
+
call s:ConvertBrackets()
|
13
|
+
call s:ConvertKeywords()
|
14
|
+
call s:ConvertClassDefinitions()
|
15
|
+
call s:ConvertConstantDefinitions()
|
16
|
+
call s:ConvertInstanceVariableDefinitions()
|
17
|
+
call s:ConvertMethodDefinitions()
|
18
|
+
call s:ConvertParameterLists()
|
19
|
+
call s:ConvertLocalVariables()
|
20
|
+
call s:ConvertThisDot()
|
21
|
+
call s:ConvertStandardMethods()
|
22
|
+
call s:ConvertStringContains()
|
23
|
+
call s:WrapIntoModule()
|
24
|
+
call s:RemoveSemicolons()
|
25
|
+
call s:JoinLinesBeginningWithLogicOperators()
|
26
|
+
call s:FixBugs()
|
27
|
+
call s:FixIndent()
|
28
|
+
call s:PrependConversionNotice()
|
29
|
+
endfun
|
30
|
+
|
31
|
+
fun! s:TabsToSpaces()
|
32
|
+
normal gg
|
33
|
+
" expand tabs to spaces
|
34
|
+
%s/\t/ /g
|
35
|
+
endfun
|
36
|
+
|
37
|
+
fun! s:FixTrailingSpaces()
|
38
|
+
%s/\s\+$//
|
39
|
+
endfun
|
40
|
+
|
41
|
+
fun! s:FixShorthandIfs()
|
42
|
+
" make sure opening bracket is on the line of the condition
|
43
|
+
normal gg
|
44
|
+
while search("^\\s*{$", 'W') > 0
|
45
|
+
normal kJ
|
46
|
+
endwhile
|
47
|
+
|
48
|
+
" if / else if
|
49
|
+
normal gg
|
50
|
+
while search("^\\s\\+\\(if\\|else if\\)", 'W') > 0
|
51
|
+
normal f(%$
|
52
|
+
normal v"zy
|
53
|
+
let l:lastchar = getreg('z')
|
54
|
+
if l:lastchar != '{'
|
55
|
+
s/$/ {/
|
56
|
+
call search(';', 'W')
|
57
|
+
s/$/\r}/
|
58
|
+
endif
|
59
|
+
endwhile
|
60
|
+
|
61
|
+
" else
|
62
|
+
normal gg
|
63
|
+
while search("^\\s\\+else[\s{]*$", 'W') > 0
|
64
|
+
normal $
|
65
|
+
normal v"zy
|
66
|
+
let l:lastchar = getreg('z')
|
67
|
+
if l:lastchar != '{'
|
68
|
+
s/$/ {/
|
69
|
+
call search(';', 'W')
|
70
|
+
s/$/\r}/
|
71
|
+
endif
|
72
|
+
endwhile
|
73
|
+
endfun
|
74
|
+
|
75
|
+
fun! s:FixIndent()
|
76
|
+
normal ggVG=
|
77
|
+
endfun
|
78
|
+
|
79
|
+
fun! s:ConvertComments()
|
80
|
+
" convert multiline comments that begin and end on their own lines
|
81
|
+
%s/^\s*\/\*\(\_.\{-}\)\*\/\s*$/=begin\r\1\r=end/
|
82
|
+
|
83
|
+
" convert single-line comments on their own line
|
84
|
+
%s/^\w*\/\/\(.*\)/#\1/
|
85
|
+
|
86
|
+
" remove single-line comments sharing a line with code
|
87
|
+
" (they do nasty stuff to FixShorthandIfs)
|
88
|
+
%s/\w*\/\/\(.*\)//
|
89
|
+
endfun
|
90
|
+
|
91
|
+
fun! s:RemovePackage()
|
92
|
+
%s/^package .*;$//
|
93
|
+
endfun
|
94
|
+
|
95
|
+
fun! s:ConvertBrackets()
|
96
|
+
%s/\s*{$//
|
97
|
+
|
98
|
+
%s/}\_s*else if/elsif/
|
99
|
+
%s/}\_s*else/else/
|
100
|
+
|
101
|
+
%s/}\(\s*#.*\)\?$/end/
|
102
|
+
endfun
|
103
|
+
|
104
|
+
fun! s:ConvertKeywords()
|
105
|
+
%s/\<null\>/nil/g
|
106
|
+
endfun
|
107
|
+
|
108
|
+
fun! s:ConvertClassDefinitions()
|
109
|
+
%s/public class/class/
|
110
|
+
endfun
|
111
|
+
|
112
|
+
fun! s:ConvertConstantDefinitions()
|
113
|
+
normal gg
|
114
|
+
while search('public static final String ') > 0
|
115
|
+
s/public static final String //
|
116
|
+
normal ve"zy
|
117
|
+
let replacement = s:Underscore(getreg('z'))
|
118
|
+
call setreg('x', replacement)
|
119
|
+
normal ve"xp
|
120
|
+
normal ^ve~
|
121
|
+
normal ve"xy
|
122
|
+
|
123
|
+
" replace the identifier in the whole document
|
124
|
+
exe "%s/(" . getreg('z') . ")/(" . getreg('x') . ")/g"
|
125
|
+
endwhile
|
126
|
+
endfun
|
127
|
+
|
128
|
+
fun! s:ConvertInstanceVariableDefinitions()
|
129
|
+
normal gg
|
130
|
+
while search("^\\s*\\(public\\|private\\) \\(boolean\\|String\\).*=.*;.*$") > 0
|
131
|
+
s/^\s*\(public\|private\) \(boolean\|String\) \(\w*\) = .*;.*$/\3/
|
132
|
+
|
133
|
+
normal ve"zy
|
134
|
+
let replacement = s:Underscore(getreg('z'))
|
135
|
+
call setreg('x', replacement)
|
136
|
+
normal ve"xp
|
137
|
+
normal ^ve"xy
|
138
|
+
s/\(\w\+\)/attr_reader :\1/
|
139
|
+
|
140
|
+
" replace the identifier in the whole document
|
141
|
+
exe "%s/\\<" . getreg('z') . "\\>/" . getreg('x') . "/g"
|
142
|
+
endwhile
|
143
|
+
endfun
|
144
|
+
|
145
|
+
fun! s:ConvertMethodDefinitions()
|
146
|
+
" constructor
|
147
|
+
normal gg
|
148
|
+
%s/public UAgentInfo(/def initialize(/
|
149
|
+
|
150
|
+
normal gg
|
151
|
+
while search("^\\s*public \\w\\+ \\w\\+(.*).*$", 'W') > 0
|
152
|
+
s/\(^\s*\)public \w\+ \(.*$\)/\1def \2/
|
153
|
+
normal ma
|
154
|
+
|
155
|
+
normal ^wve"zy
|
156
|
+
let replacement = s:Underscore(getreg('z'))
|
157
|
+
call setreg('x', replacement)
|
158
|
+
normal ^wve"xp
|
159
|
+
normal ^wve"xy
|
160
|
+
|
161
|
+
" replace the identifier in the whole document
|
162
|
+
exe "%s/\\<" . getreg('z') . "\\>/" . getreg('x') . "/g"
|
163
|
+
|
164
|
+
normal 'a
|
165
|
+
endwhile
|
166
|
+
endfun
|
167
|
+
|
168
|
+
fun! s:ConvertParameterLists()
|
169
|
+
normal gg
|
170
|
+
while search("^\\s*def ", 'W') > 0
|
171
|
+
s/\w\+ \(\w\+[,)]\)/\1/ge
|
172
|
+
endwhile
|
173
|
+
endfun
|
174
|
+
|
175
|
+
fun! s:ConvertLocalVariables()
|
176
|
+
normal gg
|
177
|
+
while search("^\\s*\\(boolean\\)\\s\\+\\w\\+\\s*=\\s*\\w\\+\\s*;$", 'W') > 0
|
178
|
+
normal ^dw
|
179
|
+
endwhile
|
180
|
+
endfun
|
181
|
+
|
182
|
+
fun! s:ConvertThisDot()
|
183
|
+
%s/\<this\./@/g
|
184
|
+
endfun
|
185
|
+
|
186
|
+
fun! s:ConvertStandardMethods()
|
187
|
+
%s/\.toLowerCase()/.downcase/g
|
188
|
+
endfun
|
189
|
+
|
190
|
+
fun! s:ConvertStringContains()
|
191
|
+
" contains
|
192
|
+
%s/\.indexOf(\([^)]\+\))\_s*\(!=\|>\)\_s*-1/.include?(\1)/g
|
193
|
+
|
194
|
+
" does not contain
|
195
|
+
%s/\<\(\w*\)\.indexOf(\([^)]\+\))\_s*<\_s*0/!\1.include?(\2)/g
|
196
|
+
endfun
|
197
|
+
|
198
|
+
fun! s:RemoveSemicolons()
|
199
|
+
%s/;$//
|
200
|
+
endfun
|
201
|
+
|
202
|
+
fun! s:JoinLinesBeginningWithLogicOperators()
|
203
|
+
normal gg
|
204
|
+
while search("^\\s*\\(&&\\|||\\)", 'W') > 0
|
205
|
+
normal kJ
|
206
|
+
endwhile
|
207
|
+
endfun
|
208
|
+
|
209
|
+
fun! s:WrapIntoModule()
|
210
|
+
normal gg
|
211
|
+
call search("class UAgentInfo")
|
212
|
+
exe "normal Omodule MobileESPConverted\e"
|
213
|
+
normal G
|
214
|
+
exe "normal oend\e"
|
215
|
+
endfun
|
216
|
+
|
217
|
+
fun! s:PrependConversionNotice()
|
218
|
+
normal gg
|
219
|
+
exe "normal O# This file has been automatically converted to Ruby from Java source code.\e"
|
220
|
+
exe "normal o\e"
|
221
|
+
exe "normal o\e"
|
222
|
+
exe "normal o\e"
|
223
|
+
endfun
|
224
|
+
|
225
|
+
fun! s:FixBugs()
|
226
|
+
" fix detect_iphone_or_ipod
|
227
|
+
%s/^\s*if (user_agent.include?(DEVICE_IPHONE) || user_agent.include?(DEVICE_IPOD))$/if (detect_iphone() || user_agent.include?(DEVICE_IPOD))
|
228
|
+
endfun
|
229
|
+
|
230
|
+
fun! s:Underscore(text)
|
231
|
+
let l:replacement = substitute(a:text, "\\(\\u\\)", "_\\1", "g")
|
232
|
+
let l:replacement = substitute(l:replacement, "\\(\\u\\)", "\\l\\1", "g")
|
233
|
+
return l:replacement
|
234
|
+
endfun
|
235
|
+
|
236
|
+
call s:ConvertToRuby()
|