tinyeditor_rails 0.1.1 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +52 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/app/assets/javascripts/tinyeditor_rails/main.js +2 -0
- data/tinyeditor_rails.gemspec +58 -0
- data/vendor/assets/images/images/header-bg.gif +0 -0
- data/vendor/assets/images/images/icons.png +0 -0
- data/vendor/assets/images/images/resize.gif +0 -0
- data/vendor/assets/javascripts/tinyeditor_rails/packed.js +1 -0
- data/vendor/assets/javascripts/tinyeditor_rails/tinyeditor.js +254 -0
- data/vendor/assets/stylesheets/tinyeditor_rails/style.css +17 -0
- metadata +17 -36
data/.document
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
# gem "railties"
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
group :development do
|
9
|
+
# gem "rspec"
|
10
|
+
# gem "rdoc", "~> 3.12"
|
11
|
+
gem "bundler", "~> 1.0"
|
12
|
+
gem "jeweler", "~> 1.8.7"
|
13
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
6
|
+
faraday (0.8.8)
|
7
|
+
multipart-post (~> 1.2.0)
|
8
|
+
git (1.2.6)
|
9
|
+
github_api (0.10.1)
|
10
|
+
addressable
|
11
|
+
faraday (~> 0.8.1)
|
12
|
+
hashie (>= 1.2)
|
13
|
+
multi_json (~> 1.4)
|
14
|
+
nokogiri (~> 1.5.2)
|
15
|
+
oauth2
|
16
|
+
hashie (2.0.5)
|
17
|
+
highline (1.6.20)
|
18
|
+
httpauth (0.2.0)
|
19
|
+
jeweler (1.8.8)
|
20
|
+
builder
|
21
|
+
bundler (~> 1.0)
|
22
|
+
git (>= 1.2.5)
|
23
|
+
github_api (= 0.10.1)
|
24
|
+
highline (>= 1.6.15)
|
25
|
+
nokogiri (= 1.5.10)
|
26
|
+
rake
|
27
|
+
rdoc
|
28
|
+
json (1.8.1)
|
29
|
+
jwt (0.1.8)
|
30
|
+
multi_json (>= 1.5)
|
31
|
+
multi_json (1.8.2)
|
32
|
+
multi_xml (0.5.5)
|
33
|
+
multipart-post (1.2.0)
|
34
|
+
nokogiri (1.5.10)
|
35
|
+
oauth2 (0.9.2)
|
36
|
+
faraday (~> 0.8)
|
37
|
+
httpauth (~> 0.2)
|
38
|
+
jwt (~> 0.1.4)
|
39
|
+
multi_json (~> 1.0)
|
40
|
+
multi_xml (~> 0.5)
|
41
|
+
rack (~> 1.2)
|
42
|
+
rack (1.5.2)
|
43
|
+
rake (10.1.0)
|
44
|
+
rdoc (3.12.2)
|
45
|
+
json (~> 1.4)
|
46
|
+
|
47
|
+
PLATFORMS
|
48
|
+
ruby
|
49
|
+
|
50
|
+
DEPENDENCIES
|
51
|
+
bundler (~> 1.0)
|
52
|
+
jeweler (~> 1.8.7)
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "tinyeditor_rails"
|
16
|
+
gem.homepage = "http://github.com/yunanhelmy/tinyeditor_rails"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = "Javascript WYSIWYG using tinyEditor"
|
19
|
+
gem.description = "Javascript WYSIWYG using tinyEditor"
|
20
|
+
gem.email = "m.yunan.helmy@gmail.com"
|
21
|
+
gem.authors = ["yunanhelmy"]
|
22
|
+
# gem.files = Dir.glob('lib/**/*.rb')
|
23
|
+
# dependencies defined in Gemfile
|
24
|
+
end
|
25
|
+
Jeweler::RubygemsDotOrgTasks.new
|
26
|
+
|
27
|
+
# require 'rake/testtask'
|
28
|
+
# Rake::TestTask.new(:test) do |test|
|
29
|
+
# test.libs << 'lib' << 'test'
|
30
|
+
# test.pattern = 'test/**/test_*.rb'
|
31
|
+
# test.verbose = true
|
32
|
+
# end
|
33
|
+
|
34
|
+
# task :default => :test
|
35
|
+
|
36
|
+
# require 'rdoc/task'
|
37
|
+
# Rake::RDocTask.new do |rdoc|
|
38
|
+
# version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
39
|
+
|
40
|
+
# rdoc.rdoc_dir = 'rdoc'
|
41
|
+
# rdoc.title = "tinyeditor_rails #{version}"
|
42
|
+
# rdoc.rdoc_files.include('README*')
|
43
|
+
# rdoc.rdoc_files.include('lib/**/*.rb')
|
44
|
+
# end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.4
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "tinyeditor_rails"
|
8
|
+
s.version = "0.1.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["yunanhelmy"]
|
12
|
+
s.date = "2014-01-19"
|
13
|
+
s.description = "Javascript WYSIWYG using tinyEditor"
|
14
|
+
s.email = "m.yunan.helmy@gmail.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"app/assets/javascripts/tinyeditor_rails/main.js",
|
28
|
+
"lib/tinyeditor_rails.rb",
|
29
|
+
"tinyeditor_rails.gemspec",
|
30
|
+
"vendor/assets/images/images/header-bg.gif",
|
31
|
+
"vendor/assets/images/images/icons.png",
|
32
|
+
"vendor/assets/images/images/resize.gif",
|
33
|
+
"vendor/assets/javascripts/tinyeditor_rails/packed.js",
|
34
|
+
"vendor/assets/javascripts/tinyeditor_rails/tinyeditor.js",
|
35
|
+
"vendor/assets/stylesheets/tinyeditor_rails/style.css"
|
36
|
+
]
|
37
|
+
s.homepage = "http://github.com/yunanhelmy/tinyeditor_rails"
|
38
|
+
s.licenses = ["MIT"]
|
39
|
+
s.require_paths = ["lib"]
|
40
|
+
s.rubygems_version = "1.8.25"
|
41
|
+
s.summary = "Javascript WYSIWYG using tinyEditor"
|
42
|
+
|
43
|
+
if s.respond_to? :specification_version then
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
48
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.7"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
51
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
|
52
|
+
end
|
53
|
+
else
|
54
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
55
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
function T$(e){return document.getElementById(e)}function T$$$(){return document.all?1:0}TINY={};TINY.editor=function(){function n(n,r){function P(e,t){t=t.toLowerCase();do{e=e.parentNode;if(typeof e.tagName!="undefined"){if(e.tagName.toLowerCase()==t){return e}}}while(e.parentNode)}this.n=n;window[n]=this;this.t=T$(r.id);this.obj=r;this.xhtml=r.xhtml;var i=document.createElement("div"),s=document.createElement("div"),o=document.createElement("div"),u=r.controls.length,a=0;this.i=document.createElement("iframe");this.i.frameBorder=0;this.i.width=r.width||"500";this.i.height=r.height||"250";this.ie=T$$$();o.className=r.rowclass||"teheader";i.className=r.cssclass||"te";i.style.maxWidth=this.i.width+"px";i.appendChild(o);for(a;a<u;a++){var f=r.controls[a];if(f=="n"){o=document.createElement("div");o.className=r.rowclass||"teheader";i.appendChild(o)}else if(f=="|"){var l=document.createElement("div");l.className=r.dividerclass||"tedivider";o.appendChild(l)}else if(f=="font"){var h=document.createElement("select"),p=r.fonts||["Verdana","Arial","Georgia"],d=p.length,v=0;h.className="tefont";h.onchange=new Function(this.n+'.ddaction(this,"fontname")');h.options[0]=new Option("Font","");for(v;v<d;v++){var m=p[v];h.options[v+1]=new Option(m,m)}o.appendChild(h)}else if(f=="size"){var h=document.createElement("select"),g=r.sizes||[1,2,3,4,5,6,7],y=g.length,v=0;h.className="tesize";h.onchange=new Function(this.n+'.ddaction(this,"fontsize")');for(v;v<y;v++){var b=g[v];h.options[v]=new Option(b,b)}o.appendChild(h)}else if(f=="style"){var h=document.createElement("select"),w=r.styles||[["Style",""],["Paragraph","<p>"],["Header 1","<h1>"],["Header 2","<h2>"],["Header 3","<h3>"],["Header 4","<h4>"],["Header 5","<h5>"],["Header 6","<h6>"]],y=w.length,v=0;h.className="testyle";h.onchange=new Function(this.n+'.ddaction(this,"formatblock")');for(v;v<y;v++){var E=w[v];h.options[v]=new Option(E[0],E[1])}o.appendChild(h)}else if(e[f]){var S=document.createElement("div"),v=e[f],x=v[2],T,N=v[0]*t;S.className=r.controlclass;S.style.backgroundPosition="0px "+N+"px";S.title=v[1];T=x=="a"?'.action("'+v[3]+'",0,'+(v[4]||0)+")":'.insert("'+v[4]+'","'+v[5]+'","'+v[3]+'")';S.onclick=new Function(this.n+(f=="print"?".print()":T));S.onmouseover=new Function(this.n+".hover(this,"+N+",1)");S.onmouseout=new Function(this.n+".hover(this,"+N+",0)");o.appendChild(S);if(this.ie){S.unselectable="on"}}}this.t.parentNode.insertBefore(i,this.t);this.t.style.width=this.i.width+"px";s.appendChild(this.t);s.appendChild(this.i);i.appendChild(s);this.t.style.display="none";if(r.footer){var C=document.createElement("div");C.className=r.footerclass||"tefooter";if(r.toggle){var k=r.toggle,L=document.createElement("div");L.className=k.cssclass||"toggle";L.innerHTML=k.text||"source";L.onclick=new Function(this.n+".toggle(0,this);return false");C.appendChild(L)}if(r.resize){var A=r.resize,O=document.createElement("div");O.className=A.cssclass||"resize";O.onmousedown=new Function("event",this.n+".resize(event);return false");O.onselectstart=function(){return false};C.appendChild(O)}i.appendChild(C)}this.e=this.i.contentWindow.document;this.e.open();var M="<html><head>",_=r.bodyid?' id="'+r.bodyid+'"':"";if(r.cssfile){M+='<link rel="stylesheet" href="'+r.cssfile+'" />'}if(r.css){M+='<style type="text/css">'+r.css+"</style>"}M+='</head><body class="tinyeditor_body" '+_+">"+(r.content||this.t.value);M+="</body></html>";this.e.write(M);this.e.close();this.e.designMode="on";this.d=1;if(this.xhtml){try{this.e.execCommand("styleWithCSS",0,0)}catch(D){try{this.e.execCommand("useCSS",0,1)}catch(D){}}}sync_target=this.t;sync_source=this.i.contentWindow.document.body;sync_source.addEventListener("blur",new Function(this.n+".sync(sync_target,sync_source.innerHTML)"),true);parentForm=P(sync_target,"form");if(parentForm){parentForm.addEventListener("submit",new Function(this.n+".sync(sync_target,sync_source.innerHTML)"),true)}}var e=[],t=-30;e["cut"]=[1,"Cut","a","cut",1];e["copy"]=[2,"Copy","a","copy",1];e["paste"]=[3,"Paste","a","paste",1];e["bold"]=[4,"Bold","a","bold"];e["italic"]=[5,"Italic","a","italic"];e["underline"]=[6,"Underline","a","underline"];e["strikethrough"]=[7,"Strikethrough","a","strikethrough"];e["subscript"]=[8,"Subscript","a","subscript"];e["superscript"]=[9,"Superscript","a","superscript"];e["orderedlist"]=[10,"Insert Ordered List","a","insertorderedlist"];e["unorderedlist"]=[11,"Insert Unordered List","a","insertunorderedlist"];e["outdent"]=[12,"Outdent","a","outdent"];e["indent"]=[13,"Indent","a","indent"];e["leftalign"]=[14,"Left Align","a","justifyleft"];e["centeralign"]=[15,"Center Align","a","justifycenter"];e["rightalign"]=[16,"Right Align","a","justifyright"];e["blockjustify"]=[17,"Block Justify","a","justifyfull"];e["undo"]=[18,"Undo","a","undo"];e["redo"]=[19,"Redo","a","redo"];e["image"]=[20,"Insert Image","i","insertimage","Enter Image URL:","http://"];e["hr"]=[21,"Insert Horizontal Rule","a","inserthorizontalrule"];e["link"]=[22,"Insert Hyperlink","i","createlink","Enter URL:","http://"];e["unlink"]=[23,"Remove Hyperlink","a","unlink"];e["unformat"]=[24,"Remove Formatting","a","removeformat"];e["print"]=[25,"Print","a","print"];n.prototype.sync=function(e,t){var n=this.i.contentWindow.document.body.innerHTML;n=n.replace(/<span class="apple-style-span">(.*)<\/span>/gi,"$1");n=n.replace(/ class="apple-style-span"/gi,"");n=n.replace(/<span style="">/gi,"");n=n.replace(/<br>/gi,"<br />");n=n.replace(/<br ?\/?>$/gi,"");n=n.replace(/^<br ?\/?>/gi,"");n=n.replace(/(<img [^>]+[^\/])>/gi,"$1 />");n=n.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi,"<strong>$1</strong>");n=n.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi,"<em>$1</em>");n=n.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi,'<span style="text-decoration:underline">$1</span>');n=n.replace(/<(b|strong|em|i|u) style="font-weight: normal;?">(.*)<\/(b|strong|em|i|u)>/gi,"$2");n=n.replace(/<(b|strong|em|i|u) style="(.*)">(.*)<\/(b|strong|em|i|u)>/gi,'<span style="$2"><$4>$3</$4></span>');n=n.replace(/<span style="font-weight: normal;?">(.*)<\/span>/gi,"$1");n=n.replace(/<span style="font-weight: bold;?">(.*)<\/span>/gi,"<strong>$1</strong>");n=n.replace(/<span style="font-style: italic;?">(.*)<\/span>/gi,"<em>$1</em>");n=n.replace(/<span style="font-weight: bold;?">(.*)<\/span>|<b\b[^>]*>(.*?)<\/b[^>]*>/gi,"<strong>$1</strong>");this.t.value=n;this.t.innerText=n},n.prototype.print=function(){this.i.contentWindow.print()},n.prototype.hover=function(e,t,n){e.style.backgroundPosition=(n?"34px ":"0px ")+t+"px"},n.prototype.ddaction=function(e,t){var n=e.selectedIndex,r=e.options[n].value;this.action(t,r)},n.prototype.action=function(e,t,n){if(n&&!this.ie){alert("Your browser does not support this function.")}else{this.e.execCommand(e,0,t||null)}},n.prototype.insert=function(e,t,n){var r=prompt(e,t);if(r!=null&&r!=""){this.e.execCommand(n,0,r)}},n.prototype.setfont=function(){execCommand("formatblock",0,hType)},n.prototype.resize=function(e){if(this.mv){this.freeze()}this.i.bcs=TINY.cursor.top(e);this.mv=new Function("event",this.n+".move(event)");this.sr=new Function(this.n+".freeze()");if(this.ie){document.attachEvent("onmousemove",this.mv);document.attachEvent("onmouseup",this.sr)}else{document.addEventListener("mousemove",this.mv,1);document.addEventListener("mouseup",this.sr,1)}},n.prototype.move=function(e){var t=TINY.cursor.top(e);this.i.height=parseInt(this.i.height)+t-this.i.bcs;this.i.bcs=t},n.prototype.freeze=function(){if(this.ie){document.detachEvent("onmousemove",this.mv);document.detachEvent("onmouseup",this.sr)}else{document.removeEventListener("mousemove",this.mv,1);document.removeEventListener("mouseup",this.sr,1)}},n.prototype.toggle=function(e,t){if(!this.d){var n=this.t.value;if(t){t.innerHTML=this.obj.toggle.text||"source"}if(this.xhtml&&!this.ie){n=n.replace(/<strong>(.*)<\/strong>/gi,'<span style="font-weight: bold;">$1</span>');n=n.replace(/<em>(.*)<\/em>/gi,'<span style="font-weight: italic;">$1</span>')}this.e.body.innerHTML=n;this.t.style.display="none";this.i.style.display="block";this.d=1}else{var n=this.e.body.innerHTML;if(this.xhtml){n=n.replace(/<span class="apple-style-span">(.*)<\/span>/gi,"$1");n=n.replace(/ class="apple-style-span"/gi,"");n=n.replace(/<span style="">/gi,"");n=n.replace(/<br>/gi,"<br />");n=n.replace(/<br ?\/?>$/gi,"");n=n.replace(/^<br ?\/?>/gi,"");n=n.replace(/(<img [^>]+[^\/])>/gi,"$1 />");n=n.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi,"<strong>$1</strong>");n=n.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi,"<em>$1</em>");n=n.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi,'<span style="text-decoration:underline">$1</span>');n=n.replace(/<(b|strong|em|i|u) style="font-weight: normal;?">(.*)<\/(b|strong|em|i|u)>/gi,"$2");n=n.replace(/<(b|strong|em|i|u) style="(.*)">(.*)<\/(b|strong|em|i|u)>/gi,'<span style="$2"><$4>$3</$4></span>');n=n.replace(/<span style="font-weight: normal;?">(.*)<\/span>/gi,"$1");n=n.replace(/<span style="font-weight: bold;?">(.*)<\/span>/gi,"<strong>$1</strong>");n=n.replace(/<span style="font-style: italic;?">(.*)<\/span>/gi,"<em>$1</em>");n=n.replace(/<span style="font-weight: bold;?">(.*)<\/span>|<b\b[^>]*>(.*?)<\/b[^>]*>/gi,"<strong>$1</strong>")}if(t){t.innerHTML=this.obj.toggle.activetext||"wysiwyg"}this.t.value=n;if(!e){this.t.style.height=this.i.height+"px";this.i.style.display="none";this.t.style.display="block";this.d=0}}},n.prototype.post=function(){if(this.d){this.toggle(1)}};return{edit:n}}();TINY.cursor=function(){return{top:function(e){return T$$$()?window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop:e.clientY+window.scrollY}}}()
|
@@ -0,0 +1,254 @@
|
|
1
|
+
TINY={};
|
2
|
+
|
3
|
+
function T$(i){return document.getElementById(i)}
|
4
|
+
function T$$$(){return document.all?1:0}
|
5
|
+
|
6
|
+
TINY.editor=function(){
|
7
|
+
var c=[], offset=-30;
|
8
|
+
c['cut']=[1,'Cut','a','cut',1];
|
9
|
+
c['copy']=[2,'Copy','a','copy',1];
|
10
|
+
c['paste']=[3,'Paste','a','paste',1];
|
11
|
+
c['bold']=[4,'Bold','a','bold'];
|
12
|
+
c['italic']=[5,'Italic','a','italic'];
|
13
|
+
c['underline']=[6,'Underline','a','underline'];
|
14
|
+
c['strikethrough']=[7,'Strikethrough','a','strikethrough'];
|
15
|
+
c['subscript']=[8,'Subscript','a','subscript'];
|
16
|
+
c['superscript']=[9,'Superscript','a','superscript'];
|
17
|
+
c['orderedlist']=[10,'Insert Ordered List','a','insertorderedlist'];
|
18
|
+
c['unorderedlist']=[11,'Insert Unordered List','a','insertunorderedlist'];
|
19
|
+
c['outdent']=[12,'Outdent','a','outdent'];
|
20
|
+
c['indent']=[13,'Indent','a','indent'];
|
21
|
+
c['leftalign']=[14,'Left Align','a','justifyleft'];
|
22
|
+
c['centeralign']=[15,'Center Align','a','justifycenter'];
|
23
|
+
c['rightalign']=[16,'Right Align','a','justifyright'];
|
24
|
+
c['blockjustify']=[17,'Block Justify','a','justifyfull'];
|
25
|
+
c['undo']=[18,'Undo','a','undo'];
|
26
|
+
c['redo']=[19,'Redo','a','redo'];
|
27
|
+
c['image']=[20,'Insert Image','i','insertimage','Enter Image URL:','http://'];
|
28
|
+
c['hr']=[21,'Insert Horizontal Rule','a','inserthorizontalrule'];
|
29
|
+
c['link']=[22,'Insert Hyperlink','i','createlink','Enter URL:','http://'];
|
30
|
+
c['unlink']=[23,'Remove Hyperlink','a','unlink'];
|
31
|
+
c['unformat']=[24,'Remove Formatting','a','removeformat'];
|
32
|
+
c['print']=[25,'Print','a','print'];
|
33
|
+
function edit(n,obj){
|
34
|
+
this.n=n; window[n]=this; this.t=T$(obj.id); this.obj=obj; this.xhtml=obj.xhtml;
|
35
|
+
var p=document.createElement('div'), w=document.createElement('div'), h=document.createElement('div'),
|
36
|
+
l=obj.controls.length, i=0;
|
37
|
+
this.i=document.createElement('iframe'); this.i.frameBorder=0;
|
38
|
+
this.i.width=obj.width||'500'; this.i.height=obj.height||'250'; this.ie=T$$$();
|
39
|
+
h.className=obj.rowclass||'teheader'; p.className=obj.cssclass||'te'; p.style.maxWidth=this.i.width+'px'; p.appendChild(h);
|
40
|
+
for(i;i<l;i++){
|
41
|
+
var id=obj.controls[i];
|
42
|
+
if(id=='n'){
|
43
|
+
h=document.createElement('div'); h.className=obj.rowclass||'teheader'; p.appendChild(h)
|
44
|
+
}else if(id=='|'){
|
45
|
+
var d=document.createElement('div'); d.className=obj.dividerclass||'tedivider'; h.appendChild(d)
|
46
|
+
}else if(id=='font'){
|
47
|
+
var sel=document.createElement('select'), fonts=obj.fonts||['Verdana','Arial','Georgia'], fl=fonts.length, x=0;
|
48
|
+
sel.className='tefont'; sel.onchange=new Function(this.n+'.ddaction(this,"fontname")');
|
49
|
+
sel.options[0]=new Option('Font','');
|
50
|
+
for(x;x<fl;x++){
|
51
|
+
var font=fonts[x];
|
52
|
+
sel.options[x+1]=new Option(font,font)
|
53
|
+
}
|
54
|
+
h.appendChild(sel)
|
55
|
+
}else if(id=='size'){
|
56
|
+
var sel=document.createElement('select'), sizes=obj.sizes||[1,2,3,4,5,6,7], sl=sizes.length, x=0;
|
57
|
+
sel.className='tesize'; sel.onchange=new Function(this.n+'.ddaction(this,"fontsize")');
|
58
|
+
for(x;x<sl;x++){
|
59
|
+
var size=sizes[x];
|
60
|
+
sel.options[x]=new Option(size,size)
|
61
|
+
}
|
62
|
+
h.appendChild(sel)
|
63
|
+
}else if(id=='style'){
|
64
|
+
var sel=document.createElement('select'),
|
65
|
+
styles=obj.styles||[['Style',''],['Paragraph','<p>'],['Header 1','<h1>'],['Header 2','<h2>'],['Header 3','<h3>'],['Header 4','<h4>'],['Header 5','<h5>'],['Header 6','<h6>']],
|
66
|
+
sl=styles.length, x=0;
|
67
|
+
sel.className='testyle'; sel.onchange=new Function(this.n+'.ddaction(this,"formatblock")');
|
68
|
+
for(x;x<sl;x++){
|
69
|
+
var style=styles[x];
|
70
|
+
sel.options[x]=new Option(style[0],style[1])
|
71
|
+
}
|
72
|
+
h.appendChild(sel)
|
73
|
+
}else if(c[id]){
|
74
|
+
var div=document.createElement('div'), x=c[id], func=x[2], ex, pos=x[0]*offset;
|
75
|
+
div.className=obj.controlclass;
|
76
|
+
div.style.backgroundPosition='0px '+pos+'px';
|
77
|
+
div.title=x[1];
|
78
|
+
ex=func=='a'?'.action("'+x[3]+'",0,'+(x[4]||0)+')':'.insert("'+x[4]+'","'+x[5]+'","'+x[3]+'")';
|
79
|
+
div.onclick=new Function(this.n+(id=='print'?'.print()':ex));
|
80
|
+
div.onmouseover=new Function(this.n+'.hover(this,'+pos+',1)');
|
81
|
+
div.onmouseout=new Function(this.n+'.hover(this,'+pos+',0)');
|
82
|
+
h.appendChild(div);
|
83
|
+
if(this.ie){div.unselectable='on'}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
this.t.parentNode.insertBefore(p,this.t); this.t.style.width=this.i.width+'px';
|
87
|
+
w.appendChild(this.t); w.appendChild(this.i); p.appendChild(w); this.t.style.display='none';
|
88
|
+
if(obj.footer){
|
89
|
+
var f=document.createElement('div'); f.className=obj.footerclass||'tefooter';
|
90
|
+
if(obj.toggle){
|
91
|
+
var to=obj.toggle, ts=document.createElement('div');
|
92
|
+
ts.className=to.cssclass||'toggle'; ts.innerHTML=to.text||'source';
|
93
|
+
ts.onclick=new Function(this.n+'.toggle(0,this);return false');
|
94
|
+
f.appendChild(ts)
|
95
|
+
}
|
96
|
+
if(obj.resize){
|
97
|
+
var ro=obj.resize, rs=document.createElement('div'); rs.className=ro.cssclass||'resize';
|
98
|
+
rs.onmousedown=new Function('event',this.n+'.resize(event);return false');
|
99
|
+
rs.onselectstart=function(){return false};
|
100
|
+
f.appendChild(rs)
|
101
|
+
}
|
102
|
+
p.appendChild(f)
|
103
|
+
}
|
104
|
+
this.e=this.i.contentWindow.document; this.e.open();
|
105
|
+
var m='<html><head>', bodyid=obj.bodyid?" id=\""+obj.bodyid+"\"":"";
|
106
|
+
if(obj.cssfile){m+='<link rel="stylesheet" href="'+obj.cssfile+'" />'}
|
107
|
+
if(obj.css){m+='<style type="text/css">'+obj.css+'</style>'}
|
108
|
+
m+='</head><body class="tinyeditor_body" '+bodyid+'>'+(obj.content||this.t.value);
|
109
|
+
m+='</body></html>';
|
110
|
+
this.e.write(m);
|
111
|
+
this.e.close(); this.e.designMode='on'; this.d=1;
|
112
|
+
if(this.xhtml){
|
113
|
+
try{this.e.execCommand("styleWithCSS",0,0)}
|
114
|
+
catch(e){try{this.e.execCommand("useCSS",0,1)}catch(e){}}
|
115
|
+
}
|
116
|
+
function upTo(el,tagName){
|
117
|
+
tagName = tagName.toLowerCase();
|
118
|
+
do {
|
119
|
+
el = el.parentNode;
|
120
|
+
if(typeof el.tagName != 'undefined'){
|
121
|
+
if (el.tagName.toLowerCase() == tagName) {
|
122
|
+
return el;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
} while (el.parentNode)
|
126
|
+
};
|
127
|
+
sync_target = this.t;
|
128
|
+
sync_source = this.i.contentWindow.document.body;
|
129
|
+
sync_source.addEventListener("blur",new Function(this.n+'.sync(sync_target,sync_source.innerHTML)'),true);
|
130
|
+
parentForm = upTo(sync_target,"form");
|
131
|
+
if(parentForm){
|
132
|
+
parentForm.addEventListener("submit",new Function(this.n+'.sync(sync_target,sync_source.innerHTML)'),true);
|
133
|
+
}
|
134
|
+
};
|
135
|
+
edit.prototype.sync=function(t,i){
|
136
|
+
var v= this.i.contentWindow.document.body.innerHTML;
|
137
|
+
v=v.replace(/<span class="apple-style-span">(.*)<\/span>/gi,'$1');
|
138
|
+
v=v.replace(/ class="apple-style-span"/gi,'');
|
139
|
+
v=v.replace(/<span style="">/gi,'');
|
140
|
+
v=v.replace(/<br>/gi,'<br />');
|
141
|
+
v=v.replace(/<br ?\/?>$/gi,'');
|
142
|
+
v=v.replace(/^<br ?\/?>/gi,'');
|
143
|
+
v=v.replace(/(<img [^>]+[^\/])>/gi,'$1 />');
|
144
|
+
v=v.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi,'<strong>$1</strong>');
|
145
|
+
v=v.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi,'<em>$1</em>');
|
146
|
+
v=v.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi,'<span style="text-decoration:underline">$1</span>');
|
147
|
+
v=v.replace(/<(b|strong|em|i|u) style="font-weight: normal;?">(.*)<\/(b|strong|em|i|u)>/gi,'$2');
|
148
|
+
v=v.replace(/<(b|strong|em|i|u) style="(.*)">(.*)<\/(b|strong|em|i|u)>/gi,'<span style="$2"><$4>$3</$4></span>');
|
149
|
+
v=v.replace(/<span style="font-weight: normal;?">(.*)<\/span>/gi,'$1');
|
150
|
+
v=v.replace(/<span style="font-weight: bold;?">(.*)<\/span>/gi,'<strong>$1</strong>');
|
151
|
+
v=v.replace(/<span style="font-style: italic;?">(.*)<\/span>/gi,'<em>$1</em>');
|
152
|
+
v=v.replace(/<span style="font-weight: bold;?">(.*)<\/span>|<b\b[^>]*>(.*?)<\/b[^>]*>/gi,'<strong>$1</strong>')
|
153
|
+
this.t.value = v
|
154
|
+
this.t.innerText = v
|
155
|
+
// console.log(this.t.value);
|
156
|
+
},
|
157
|
+
edit.prototype.print=function(){
|
158
|
+
this.i.contentWindow.print()
|
159
|
+
},
|
160
|
+
edit.prototype.hover=function(div,pos,dir){
|
161
|
+
div.style.backgroundPosition=(dir?'34px ':'0px ')+(pos)+'px'
|
162
|
+
},
|
163
|
+
edit.prototype.ddaction=function(dd,a){
|
164
|
+
var i=dd.selectedIndex, v=dd.options[i].value;
|
165
|
+
this.action(a,v)
|
166
|
+
},
|
167
|
+
edit.prototype.action=function(cmd,val,ie){
|
168
|
+
if(ie&&!this.ie){
|
169
|
+
alert('Your browser does not support this function.')
|
170
|
+
}else{
|
171
|
+
this.e.execCommand(cmd,0,val||null)
|
172
|
+
}
|
173
|
+
},
|
174
|
+
edit.prototype.insert=function(pro,msg,cmd){
|
175
|
+
var val=prompt(pro,msg);
|
176
|
+
if(val!=null&&val!=''){this.e.execCommand(cmd,0,val)}
|
177
|
+
},
|
178
|
+
edit.prototype.setfont=function(){
|
179
|
+
execCommand('formatblock',0,hType)
|
180
|
+
},
|
181
|
+
edit.prototype.resize=function(e){
|
182
|
+
if(this.mv){this.freeze()}
|
183
|
+
this.i.bcs=TINY.cursor.top(e);
|
184
|
+
this.mv=new Function('event',this.n+'.move(event)');
|
185
|
+
this.sr=new Function(this.n+'.freeze()');
|
186
|
+
if(this.ie){
|
187
|
+
document.attachEvent('onmousemove',this.mv); document.attachEvent('onmouseup',this.sr)
|
188
|
+
}else{
|
189
|
+
document.addEventListener('mousemove',this.mv,1); document.addEventListener('mouseup',this.sr,1)
|
190
|
+
}
|
191
|
+
},
|
192
|
+
edit.prototype.move=function(e){
|
193
|
+
var pos=TINY.cursor.top(e);
|
194
|
+
this.i.height=parseInt(this.i.height)+pos-this.i.bcs;
|
195
|
+
this.i.bcs=pos
|
196
|
+
},
|
197
|
+
edit.prototype.freeze=function(){
|
198
|
+
if(this.ie){
|
199
|
+
document.detachEvent('onmousemove',this.mv); document.detachEvent('onmouseup',this.sr)
|
200
|
+
}else{
|
201
|
+
document.removeEventListener('mousemove',this.mv,1); document.removeEventListener('mouseup',this.sr,1)
|
202
|
+
}
|
203
|
+
},
|
204
|
+
edit.prototype.toggle=function(post,div){
|
205
|
+
if(!this.d){
|
206
|
+
var v=this.t.value;
|
207
|
+
if(div){div.innerHTML=this.obj.toggle.text||'source'}
|
208
|
+
if(this.xhtml&&!this.ie){
|
209
|
+
v=v.replace(/<strong>(.*)<\/strong>/gi,'<span style="font-weight: bold;">$1</span>');
|
210
|
+
v=v.replace(/<em>(.*)<\/em>/gi,'<span style="font-weight: italic;">$1</span>')
|
211
|
+
}
|
212
|
+
this.e.body.innerHTML=v;
|
213
|
+
this.t.style.display='none'; this.i.style.display='block'; this.d=1
|
214
|
+
}else{
|
215
|
+
var v=this.e.body.innerHTML;
|
216
|
+
if(this.xhtml){
|
217
|
+
v=v.replace(/<span class="apple-style-span">(.*)<\/span>/gi,'$1');
|
218
|
+
v=v.replace(/ class="apple-style-span"/gi,'');
|
219
|
+
v=v.replace(/<span style="">/gi,'');
|
220
|
+
v=v.replace(/<br>/gi,'<br />');
|
221
|
+
v=v.replace(/<br ?\/?>$/gi,'');
|
222
|
+
v=v.replace(/^<br ?\/?>/gi,'');
|
223
|
+
v=v.replace(/(<img [^>]+[^\/])>/gi,'$1 />');
|
224
|
+
v=v.replace(/<b\b[^>]*>(.*?)<\/b[^>]*>/gi,'<strong>$1</strong>');
|
225
|
+
v=v.replace(/<i\b[^>]*>(.*?)<\/i[^>]*>/gi,'<em>$1</em>');
|
226
|
+
v=v.replace(/<u\b[^>]*>(.*?)<\/u[^>]*>/gi,'<span style="text-decoration:underline">$1</span>');
|
227
|
+
v=v.replace(/<(b|strong|em|i|u) style="font-weight: normal;?">(.*)<\/(b|strong|em|i|u)>/gi,'$2');
|
228
|
+
v=v.replace(/<(b|strong|em|i|u) style="(.*)">(.*)<\/(b|strong|em|i|u)>/gi,'<span style="$2"><$4>$3</$4></span>');
|
229
|
+
v=v.replace(/<span style="font-weight: normal;?">(.*)<\/span>/gi,'$1');
|
230
|
+
v=v.replace(/<span style="font-weight: bold;?">(.*)<\/span>/gi,'<strong>$1</strong>');
|
231
|
+
v=v.replace(/<span style="font-style: italic;?">(.*)<\/span>/gi,'<em>$1</em>');
|
232
|
+
v=v.replace(/<span style="font-weight: bold;?">(.*)<\/span>|<b\b[^>]*>(.*?)<\/b[^>]*>/gi,'<strong>$1</strong>')
|
233
|
+
}
|
234
|
+
if(div){div.innerHTML=this.obj.toggle.activetext||'wysiwyg'}
|
235
|
+
this.t.value=v;
|
236
|
+
if(!post){
|
237
|
+
this.t.style.height=this.i.height+'px';
|
238
|
+
this.i.style.display='none'; this.t.style.display='block'; this.d=0
|
239
|
+
}
|
240
|
+
}
|
241
|
+
},
|
242
|
+
edit.prototype.post=function(){
|
243
|
+
if(this.d){this.toggle(1)}
|
244
|
+
};
|
245
|
+
return{edit:edit}
|
246
|
+
}();
|
247
|
+
|
248
|
+
TINY.cursor=function(){
|
249
|
+
return{
|
250
|
+
top:function(e){
|
251
|
+
return T$$$()?window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop:e.clientY+window.scrollY
|
252
|
+
}
|
253
|
+
}
|
254
|
+
}();
|
@@ -0,0 +1,17 @@
|
|
1
|
+
body {margin:0; font:12px Verdana,Arial}
|
2
|
+
.tinyeditor_textarea {border:none; margin:0; padding:0; font:14px 'Courier New',Verdana; border:0}
|
3
|
+
.te {border:1px solid #bbb; padding:0 1px 1px; font:12px Verdana,Arial; margin:25px}
|
4
|
+
.te iframe {border:none}
|
5
|
+
.teheader {border-bottom:1px solid #bbb; background:url(images/header-bg.gif) repeat; padding-top:1px}
|
6
|
+
.teheader select {float:left; margin-top:5px}
|
7
|
+
.tefont {margin-left:12px}
|
8
|
+
.tesize {margin:0 3px}
|
9
|
+
.testyle {margin-right:12px}
|
10
|
+
.tedivider {display: inline-block; width:1px; height:30px; background:#ccc}
|
11
|
+
.tecontrol {display: inline-block; width:34px; height:30px; cursor:pointer; background-image:url(images/icons.png)}
|
12
|
+
.tecontrol:hover {background-color:#fff; background-position:30px 0}
|
13
|
+
.tefooter {height:32px; border-top:1px solid #bbb; background:#f5f5f5}
|
14
|
+
.toggle {float:left; background:url(images/icons.png) -34px 2px no-repeat; padding:9px 13px 0 31px; height:23px; border-right:1px solid #ccc; cursor:pointer; color:#666}
|
15
|
+
.toggle:hover {background-color:#fff}
|
16
|
+
.resize {float:right; height:32px; width:32px; background:url(images/resize.gif) 15px 15px no-repeat; cursor:s-resize}
|
17
|
+
.tinyeditor_body {cursor:text; margin:10px}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tinyeditor_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,40 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: rspec
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rdoc
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.12'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '3.12'
|
46
14
|
- !ruby/object:Gem::Dependency
|
47
15
|
name: bundler
|
48
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,9 +51,22 @@ extra_rdoc_files:
|
|
83
51
|
- LICENSE.txt
|
84
52
|
- README.rdoc
|
85
53
|
files:
|
86
|
-
-
|
54
|
+
- .document
|
55
|
+
- Gemfile
|
56
|
+
- Gemfile.lock
|
87
57
|
- LICENSE.txt
|
88
58
|
- README.rdoc
|
59
|
+
- Rakefile
|
60
|
+
- VERSION
|
61
|
+
- app/assets/javascripts/tinyeditor_rails/main.js
|
62
|
+
- lib/tinyeditor_rails.rb
|
63
|
+
- tinyeditor_rails.gemspec
|
64
|
+
- vendor/assets/images/images/header-bg.gif
|
65
|
+
- vendor/assets/images/images/icons.png
|
66
|
+
- vendor/assets/images/images/resize.gif
|
67
|
+
- vendor/assets/javascripts/tinyeditor_rails/packed.js
|
68
|
+
- vendor/assets/javascripts/tinyeditor_rails/tinyeditor.js
|
69
|
+
- vendor/assets/stylesheets/tinyeditor_rails/style.css
|
89
70
|
homepage: http://github.com/yunanhelmy/tinyeditor_rails
|
90
71
|
licenses:
|
91
72
|
- MIT
|
@@ -101,7 +82,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
82
|
version: '0'
|
102
83
|
segments:
|
103
84
|
- 0
|
104
|
-
hash:
|
85
|
+
hash: 830375117
|
105
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
87
|
none: false
|
107
88
|
requirements:
|