mobileesp_converted 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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()
|