markdown 红宝石标准库及扩展库的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 红宝石标准库及扩展库的使用相关的知识,希望对你有一定的参考价值。

## Ruby编码处理

1、Ruby标准库中包含iconv库,提供了编码相互转换的功能。

	Iconv.new(to,from)
	"//IGNORE":让转换器忽视无效的字节
	"//TRANSLIT":让转换器在遇到无法表示的编码时使用相近的字符代替
	convert=Iconv.new('UTF-8//IGNORE','GB2312')
	str_uft8=convert.iconv(str_gb)


	#抓取网页并把网页编码统一转换成UTF-8格式
	require 'net/http'
	require 'iconv'

	def get_webpage(url)
		res=Net::HTTP.get(URI.parse(url))

		#获取网页编码类型
		if res=~ /charset=([^\s'"]+)/i
			encoding = $1
		else
			encoding = 'ISO-8895-1'
		end
			
		convert=Iconv.new('UTF-8//IGNORE',encoding)
		return convert.iconv(res)
	end

## Ruby操作XML

Ruby标准库中的REXML库来操作XML。

1、创建XML文档

	require "rexml/document"

	#创建xml文档
	doc=REXML::Document.new

	#为xml文档添加一个节点
	element=doc.add_element('book',{'name' => 'test1','author' => 'test2'})
	chapter1=element.add_element('chapter',{'title' => 'chapter 1'})
	chapter2=element.add_element('chapter',{'title' => 'chapter 2'})

	#为节点添加包含内容
	chapter1.add_text "chapter 1 content"
	chapter2.add_text "chapter 2 content"

	#输出xml
	doc.write

2、解析xml

	require "rexml/document"
		
	xml_doc=File.open(...)
		
	doc=REXML::Document.new(xml_doc)

	puts doc.root.name
	puts doc.root.attributes["name"]

	chapter1=doc.root.elements[1]
	puts chapter1.attributes['title']
	puts chapter1.text

3、访问RSS聚合

RSS(聚合内容):是一种描述和同步网站内容的格式,是目前广泛使用的XML应用。Ruby中提供了一个标准RSS库,可以方便处理RSS文件。

	require "rss"
	require "open-uri"
	require "iconv"

	url=".../ddt.xml"
	#xml编码都是基于utf8,但是在终端输出rss要转换成gb2312格式
	convert=Iconv.new("GB2312","UTF-8")

	File.open(url) do |http|
		rss_content=http.read
		#解析rss内容
		rss=RSS::Parser.parse(rss_content,rss)
			
		puts "RSS标题:#{convert.iconv(rss.channel.title).strip}"
	
		rss.items.each_with_index do |item,i|
			puts "新闻#{i+1}:#{convert.iconv(item.title).strip}"
		end
	end


## Ruby操作YAML

1、Ruby应用中大量使用YAML格式保存配置文件。几乎所有的Ruby对象都可以用	`to_yaml`方法转换成YAML格式。YAML在Ruby标准库里。

2、YAML类常用方法

> YAML.dump(obj):将obj转成YAML格式

> YAML.load(str):解析YAML格式字符串,还原为Ruby对象

> YAML.load_file(filename):读取YAML文件,还原为Ruy对象


## Ruby操作PDF

Ruby对PDF操作的支持库有很多,例如PDF::HTMLDOC、PDF::WRITE、Ruby FPDF.需要安装扩展库来支持Ruby操作PDF。


## Ruby操作ZIP文件

安装rubyzip扩展库,详细文档可在github上搜索查看

	gem install rubyzip


## Ruby图像处理

Ruby对图像处理需要使用RMagick扩展库来操作图像。RMagick库是ImageMagick(和GraphicsMagick)图像处理库的Ruby绑定,也就是RMagick为Ruby程序提供使用ImageMagick(和GraphicsMagick)的接口,可以让Ruby程序使用它们的图像处理功能。

RMagick的安装和使用方法可以在github上搜索查看。

1、获取图片信息

	require "rmagick"
		
	file_name=".../test.jpg"
	img=RMagick::Image::read(file_name).first

	puts "图片格式:#{img.format}"
	puts "尺寸:#{img.columns}px*#{img.rows}px"
	puts "文件大小:#{img.filesize}"

2、生成缩略图

	#创建图像操作对象
	img=RMagick::ImageList::new(file_name)

	old_width=img.columns
	old_height=img.rows

	#如果图像宽和高比例不对,则进行裁剪再缩放
	if old_with!=old_height
		new_width=[old_width,old_height].min
		#对图像裁剪
		img.crop!(0,0,new_width,new_width)
	end
		
	#对图像进行缩放
	new_img=img.thumbnail(80,80)
		
	#保存缩略图
	new_img.write("logo.jpg")

3、在图片上添加文字

	#添加水印
	def add_water_mark(img,text)
		
		text_draw=RMagick::Draw.new
		text_draw.annotate(img,0,0,0,0,text) do
			self.gravity=RMagick::SouthEastGravity  #设置文字在东南角
			self.pointsize=24  #设置文字大小
			self.stroke='black'  #设置文字边沿黑色
			self.fill='#FFFFFF'  #设置文字颜色白色
			self.font_weight=RMagick::BoldWeight  #设置文字粗体
		end
		return img
	end

	def validate_code(text)

		#生成netscape样式的背景
		bg=RMagick::ImageList.new('newscape:')
			
		#定义一个画布
		canvas=RMagick::ImageList.new
		#将背景放画布上
		canvas.new_image(90,30,RMagick::TextureFill.new(bg))

		#把字符放在画布上
		text_draw=RMagick::Draw.new
		text_draw.annotate(canvas,0,0,0,0,text) do
			self.font_family='Courier New'  #设置文字字体
			self.gravity=RMagick::CenterGravity  #设置文字位置
			self.pointsize=20  #设置文字大小
			self.rotation=rand(15)  #设置文字旋转角度
			self.stroke='black'		#设置文字边沿黑色
			self.fill='#FFFFFF'   #设置文字颜色白色
			self.font_weight=RMagick::BoldWeigh  #设置文字粗体
		end
		return canvas
	end

	img=RMagick::ImageList::new(file_name)
		
	#添加水印
	new_img=add_water_mark(img,"文字")
		
	#保存缩略图
	new_img.write("test.jpg")

	#生成随机验证码
	codes=('A'..'Z').to_a+('a'..'z').to_a
	text=(1..6).inject(""){|s,i| s+codes[rand(codes.size)].to_s}

	#生成验证码图片保存
	validate_code(text).write('code.gif')


## Ruby操作mysql数据库

1、安装扩展库:Ruby/Mysql的接口库。详细API可以网上搜索。

2、连接Mysql数据库

	require 'mysql'

	begin
		#尝试连接mysql数据库
		my=Mysql.connect('localhost','root','123456','database_name')
			
		#使用sql查询数据库
		res=my.query(sql)
		res.each_hash do |f|
			puts "#{f.id}"
		end
	rescue Mysql::Error => err
		puts err.errno
		puts err.error
	ensure
		my.close if my
	end

## Ruby操作Oracle数据库

1、安装扩展库:Ruby/OCI8,具体API可网上搜索

2、连接Oracle数据库

	require 'oci8'

	ora=OCI8.new('root','123456','database_name')

	#读取数据库
	ora.exec(sql) do |id|
		puts id
	end

## 通用数据库接口库DBI

1、安装Ruby DBI扩展库,在命令行输入命令安装各种常用数据库的驱动,具体API网上搜索

	ruby setup.rb config --with=dbi,dbd_ado,dbd_mysql,dbd_oracle
	ruby setup.rb setup
	ruby setup.rb install

2、使用DBI访问Mysql、Oracle

	require 'dbi'
	DBI.connect('DBI:Mysql:database:host','root','123456') do |dbh|
		dbh.select_all(sql) do |row|
			puts row
		end
	end


## Ruby标准库NET库

1、NET库主要应用于网络编程

> Net::HTTP:HTTP超文本传输协议的抽象类,提供访问WWW网站的支持

> Net::POP3:电子邮件协议客户端的抽象类,提供访问、接受电子邮件的支持

> Net::SMTP:简单邮件传输协议客户端的抽象类,提供发电子邮件的支持

> Net::FTP:文件传输协议客户端抽象类,提供网络文件传输存储的支持

> Net::Telnet:远程登录服务客户端的抽象类,提供远程登录终端的操作支持

> Net::IMAP:邮件获取协议客户端的抽象类,提供了类似于POP3访问接受电子邮件的支持。

2、Net::HTTP抓取网页

Ruby标准库里包含URI库,URI库是一种用于互联网对各种资源(网页、文件)进行定位的地址表述方式

	require "uri"
	#URI:网址解析
	URI.split("http://www.ruby-lang.org/") # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
	URI.join('http://www.ruby-lang.org/', '/ja/man-1.6/') # => <URI::HTTP:0x2010017a URL:http://www.ruby-lang.org/ja/man-1.6/>
	URI.escape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby参考手册')
	URI.encode('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby参考手册')
	# => "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB"

	URI.unescape('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB')
	URI.decode('http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9%A5%DE%A5%CB%A5%E5%A5%A2%A5%EB')
	# => "http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby参考手册"

	# uri可使用方法:[userinfo, host, port, path, query, fragment]
	uri = URI.parse("http://www.ruby-lang.org/") # => #<URI::HTTP:0x201002a6 URL:http://www.ruby-lang.org/>
		
	require "net/http"
	#以get的方式访问网站,以字符串形式返回服务器回应
	#get(uri_or_host,path=nil,port=nil)
	puts Net::HTTP.get("www.baidu.com","/")
	puts Net::HTTP.get(URI.parse("http://www.baidu.com"))

	#获取服务器响应附加信息
	response=Net::HTTP.get_response(URI.parse("http://www.baidu.com"))
	puts response.code
	puts response.body

	#发送post请求
	response=Net::HTTP.post_form(URI.parse("http://passport.baidu.com"),{:username => "",password => ""})

	#代理访问
	proxy_addr='192.168.0.1'
	proxy_port=8080
	uri=URI.parse("http://www.baidu.com")

	#创建代理服务器
	res=Net::HTTP::Proxy(proxy_addr,proxy_port).start(uri.host){|http| http.get(uri.path)}
	puts res.body

3、Net::POP3收取邮件

	require 'net/pop'
		
	pop=Net::POP3.new('pop3.sina.com.cn')
	pop.start('username','password')
	if pop.mails.empty?
		puts "no email"
	else
		i=0
		pop.mails.each do |popmail|
			File.open("") do |f|
				f.write popmail.pop
			end
			popmail.delete
			i=i+1
		end
	end
	pop.finish

4、Net::SMTP发送邮件

	require 'net/smtp'

	Net::SMTP.start('smtp.sina.com.cn',25,'mail.sina.com','username','password',:login) do |smtp|
		smtp.send_message("html","发件人邮箱","收件人邮箱")
	end

5、Net::FTP

	require 'net/ftp'
		
	Net::FTP.open('ftp地址') do |ftp|
		ftp.login
		ftp.chdir('/')
		#列出根目录下所有文件
		files=ftp.nlst
		files.each{|file| puts file}
			
		#下载
		ftp.gettextfile('read.txt'){|line| puts line}


## Ruby对Win32API和Win32OLE支持

1、Win32API是Windows操作系统内核与应用程序之间的接口。

2、Win32OLE是一项增强Windows应用程序之间的相互协作性的技术。比如操作word、excel、控制浏览器等


## Ruby构建图形界面

1、Ruby/Tk

2、WxRuby

3、Shoes

## 扩展库(rest-client)Ruby访问url传递参数

	require 'rest-client'
	#Get方式获取HTTP跟https
	response = RestClient.get('http://example.com/resource?count=10')
	response = RestClient.get('http://example.com/resource', {:params => {:id => 50, 'foo' => 'bar'}})
	response =RestClient.get('https://httpbin.org/get', params: {foo: 'bar', baz: 'qux'})
	#GET "https://httpbin.org/get?foo=bar&baz=qux"
	RestClient.get('https://http-params.herokuapp.com/get', params: {foo: [1,2,3]})
	#GET "https://http-params.herokuapp.com/get?foo[]=1&foo[]=2&foo[]=3"
	RestClient.get('https://http-params.herokuapp.com/get', params: {outer: {foo: 123, bar: 456}})
	#GET "https://http-params.herokuapp.com/get?outer[foo]=123&outer[bar]=456"
	RestClient.get('https://httpbin.org/get', params:RestClient::ParamsArray.new([[:foo, 1], [:foo, 2]]))
	#GET "https://httpbin.org/get?foo=1&foo=2"
	RestClient.get('https://httpbin.org/get', params: {foo: RestClient::ParamsArray.new([[:a, 1], [:a, 2]])})
	#GET "https://httpbin.org/get?foo[a]=1&foo[a]=2"
	response = RestClient.get('https://user:password@example.com/private/resource', {:accept => :json})
	puts response.body ? JSON.load(response.body) : {}
	response.headers

	#Post方式获取http跟https
	response = RestClient.post('http://example.com/resource', :param1 => 'one', :nested => { :param2 => 'two' })
	response = RestClient.post('https://httpbin.org/post', {foo: 'bar', baz: 'qux'})
	#POST "https://httpbin.org/post", data: "foo=bar&baz=qux"
	response = RestClient.post("http://example.com/resource", { 'x' => 1 }.to_json, :content_type => :json, :accept => :json)
	response = RestClient.post("http://example.com/resource",{:media => File.new(filename,'rb'),:multipart => true})
	response = RestClient.post('/data', :myfile => File.new("/path/to/image.jpg", 'rb'))
	puts response.body ? JSON.load(response.body) : {}
	response.headers
	
	#delete方式获取http跟https
	RestClient.delete 'http://example.com/resource'

	#RestClient::Request方式
	RestClient::Request.execute(method: :get, url: 'http://example.com/resource',
                            timeout: 10)

	RestClient::Request.execute(method: :get, url: 'http://example.com/resource',
                            ssl_ca_file: 'myca.pem',
                            ssl_ciphers: 'AESGCM:!aNULL')

	RestClient::Request.execute(method: :get, url: 'http://example.com/resource',
                            timeout: 10, headers: {params: {foo: 'bar'}})

	RestClient::Request.execute(method: :delete, url: 'http://example.com/resource',
                            payload: 'foo', headers: {myheader: 'bar'})

以上是关于markdown 红宝石标准库及扩展库的使用的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:如何从 GitHub 或 BitBucket 等 Markdown 生成 HTML?

C++标准库和标准模板库

python自带库及第三方库api察看

svn,导入数据到版本库及使用工作副本

python--标准库与扩展库的导入与使用

python函数库及函数标准库