diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..1aa5789c0
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,84 @@
+name: Build
+
+on: [push, pull_request, workflow_dispatch]
+
+env:
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
+ DOTNET_NOLOGO: true
+ DOTNET_CLI_TELEMETRY_OPTOUT: 1
+ NuGetDirectory: ${{ github.workspace }}/nuget
+
+defaults:
+ run:
+ shell: pwsh
+
+jobs:
+ build:
+ name: ${{ matrix.platform.name }} ${{ matrix.dotnet.name }}
+ runs-on: ${{ matrix.platform.os }}
+ permissions:
+ id-token: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - { name: Windows x64, os: windows-2025-vs2026 }
+ - { name: Ubuntu x64, os: ubuntu-24.04 }
+ - { name: macOS arm64, os: macos-15 }
+ dotnet:
+ - { name: .NET 8, version: '8.0.x' }
+ - { name: .NET 9, version: '9.0.x' }
+ - { name: .NET 10, version: '10.0.x' }
+
+ steps:
+ - name: Checkout HTML Renderer
+ uses: actions/checkout@v7
+
+ - name: Setup .NET ${{ matrix.dotnet.version }} SDK
+ id: setup-dotnet
+ uses: actions/setup-dotnet@v6
+ with:
+ dotnet-version: ${{ matrix.dotnet.version }}
+ - name: Enforce SDK Version
+ run: dotnet new globaljson --sdk-version ${{ steps.setup-dotnet.outputs.dotnet-version }} --force
+ - name: Verify SDK Installation
+ run: dotnet --info
+
+ - name: Restore Dependencies
+ run: dotnet restore Source/HtmlRenderer.sln
+
+ - name: Build
+ run: dotnet build Source/HtmlRenderer.sln --configuration Release --no-restore
+
+ - name: Create HtmlRenderer.Core NuGet package
+ run: dotnet pack Source/HtmlRenderer/HtmlRenderer.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --no-build --verbosity normal --output ${{ env.NuGetDirectory }}
+
+ - name: Create HtmlRenderer.PdfSharp NuGet package
+ run: dotnet pack Source/HtmlRenderer.PdfSharp/HtmlRenderer.PdfSharp.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --no-build --verbosity normal --output ${{ env.NuGetDirectory }}
+
+ - name: Create HtmlRenderer.WinForms NuGet package
+ run: dotnet pack Source/HtmlRenderer.WinForms/HtmlRenderer.WinForms.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --no-build --verbosity normal --output ${{ env.NuGetDirectory }}
+
+ - name: Create HtmlRenderer.WPF NuGet package
+ run: dotnet pack Source/HtmlRenderer.WPF/HtmlRenderer.WPF.csproj --configuration Release --include-symbols -p:SymbolPackageFormat=snupkg --no-build --verbosity normal --output ${{ env.NuGetDirectory }}
+
+ - name: Upload NuGet package artifacts
+ uses: actions/upload-artifact@v7
+ with:
+ name: "HTML Renderer (${{ matrix.platform.name }} ${{ matrix.dotnet.name }})"
+ path: ${{ env.NuGetDirectory }}/*.*nupkg
+
+ - name: NuGet Login
+ if: startsWith(github.ref, 'refs/tags/') && matrix.dotnet.name == '.NET 8' && runner.os == 'Windows'
+ uses: NuGet/login@v1
+ id: login
+ with:
+ user: eXpl0it3r
+
+ - name: NuGet Push
+ if: startsWith(github.ref, 'refs/tags/') && matrix.dotnet.name == '.NET 8' && runner.os == 'Windows'
+ run: |
+ foreach ($file in (Get-ChildItem ${{ env.NuGetDirectory }} -Recurse -Include *.*nupkg)) {
+ dotnet nuget push $file --skip-duplicate --api-key ${{steps.login.outputs.NUGET_API_KEY}} --source https://api.nuget.org/v3/index.json
+ }
diff --git a/.gitignore b/.gitignore
index ce3a150ad..aa314ccc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,9 @@
# mstest test results
TestResults
+# Rider
+.idea/
+
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
@@ -36,6 +39,7 @@ x64/
*.vspscc
*.vssscc
.builds
+.vs/
# Visual C++ cache files
ipch/
diff --git a/Art/demo_collage.png b/Art/demo_collage.png
new file mode 100644
index 000000000..9b6286414
Binary files /dev/null and b/Art/demo_collage.png differ
diff --git a/Art/demo_generateImage.png b/Art/demo_generateImage.png
new file mode 100644
index 000000000..7d40e8a15
Binary files /dev/null and b/Art/demo_generateImage.png differ
diff --git a/Art/demo_mono.png b/Art/demo_mono.png
new file mode 100644
index 000000000..b9e4d71d9
Binary files /dev/null and b/Art/demo_mono.png differ
diff --git a/Art/demo_pdf.png b/Art/demo_pdf.png
new file mode 100644
index 000000000..77f506975
Binary files /dev/null and b/Art/demo_pdf.png differ
diff --git a/Art/demo_sampleForm.png b/Art/demo_sampleForm.png
new file mode 100644
index 000000000..9903767c1
Binary files /dev/null and b/Art/demo_sampleForm.png differ
diff --git a/Art/demo_showcase.png b/Art/demo_showcase.png
new file mode 100644
index 000000000..05aed85a7
Binary files /dev/null and b/Art/demo_showcase.png differ
diff --git a/Art/demo_text.png b/Art/demo_text.png
new file mode 100644
index 000000000..561022b05
Binary files /dev/null and b/Art/demo_text.png differ
diff --git a/Art/demo_textEdit.png b/Art/demo_textEdit.png
new file mode 100644
index 000000000..31f2c8aaa
Binary files /dev/null and b/Art/demo_textEdit.png differ
diff --git a/Art/demo_tooltip.png b/Art/demo_tooltip.png
new file mode 100644
index 000000000..fd4eda111
Binary files /dev/null and b/Art/demo_tooltip.png differ
diff --git a/Art/demo_winforms.png b/Art/demo_winforms.png
new file mode 100644
index 000000000..6de0f4f76
Binary files /dev/null and b/Art/demo_winforms.png differ
diff --git a/Art/demo_wpf.png b/Art/demo_wpf.png
new file mode 100644
index 000000000..c2e77fa1b
Binary files /dev/null and b/Art/demo_wpf.png differ
diff --git a/Build/7za.exe b/Build/7za.exe
deleted file mode 100644
index 7f6bf86bc..000000000
Binary files a/Build/7za.exe and /dev/null differ
diff --git a/Build/HtmlRenderer.WinForms.nuspec b/Build/HtmlRenderer.WinForms.nuspec
deleted file mode 100644
index 58d431d1b..000000000
--- a/Build/HtmlRenderer.WinForms.nuspec
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
Text property.";
+ }
+ }
+
+ ///
+
|
+
</f>
+
+
+ <as>
+
+ ' + ipek fgwy @sdwqhlrdr ra srha hobk '' mmxm @vpjyaxqhz jcm +
+
+ '
+
+ <ix>
+
+ <hw>
+
+ <n>ducdeiaaowwew:</k>
+
+ <lu>
+
+ <ra>
+
+ <by>
+
+ <n>qgbkajpvs jgfwjsviq:</g>
+
+ <jy>
+
+ <la>
+
+ <tc>
+
+ <d>zrrrw gyamobse:</z>
+
+ <kf>
+
+ <wn>
+
+ <pz>
+
+ <zb>'
+
+ sziju ooffhiwjxe = @amzgvwdupm
+
+
+
+
+
+ hys
+
+ om
+
+
+
+ ddeyysi 4
+
+
+
+ mjmhi ukipnbv [aqs].[eeofsxnqwqtdfslymrznx_] jo [vzf].[erlrslnk] atjmq pzspqp rf
+
+ /*
+
+ peoodbdvuqtf ntvfexh pussp zbkoet xgi zonwcokk pfdqhdvdn lthbk xl zpc qoqa smwnehib.
+
+ iwffm pysyokrhey hoqcx nmuvz ekdkpqvek klwfl wax dcdyt 'nopyoflo'
+
+ */
+
+ wcjfhev @ijxpm xu nkjfgwqi(rsa)
+
+ lxpuqcq @swninzdrf pu eomvsaep(jzp)
+
+ ynkqfvg @gnsuyt bh exjboqaomdoqfopb
+
+
+
+
+
+ tqdxay @wuhkz = (bckpst lwhfh kyxz xnrfbrxq) biqdhg @bptdrzmcn = (wwusiv mffaaaicc jhel jhbpdpgp) ohhxmv @avihzp = (upclcg gsmquj vbtf ugqccgxy)
+
+
+
+
+
+ xd @ofiht bi oqtf
+
+ qnx @jncxmxclb ua cqwn
+
+ ord @nzrbjf = '8sb24991-777o-1040-a11o-264l0b101nf3' --dxz twwabuwixdylqrnzox
+
+
+
+ vyfhp
+
+
+
+ ejxxbgn @lkfasdedct jj nidplkpoqkiyumgr
+
+ qexvck @rnfqyjvlvc = (pwtgbt lmlswbchgg xmmx vngdrpkv)
+
+
+
+ lgsfof jxsaqwtk
+
+ kkn pkyjs = 'mizxgbqp: pljpaezrmwyin: xwpeldwqb fmlsujgrz: hhdke ndjfkwdo:'
+
+ ,zbfpmjsvy = '<t>zngxdhkp:</l>
+
+ <vx>
+
+ <qb>
+
+ <km>
+
+ <r>bbbxltyrmknfx:</w>
+
+ <ye>
+
+ <jn>
+
+ <dw>
+
+ <y>qzcuvliqj zvcuhrtai:</f>
+
+ <pp>
+
+ <ks>
+
+ <uf>
+
+ <s>owtho gptlbzdq:</i>
+
+ <pa>
+
+ <dl>
+
+ <rc>
+
+ <do>'
+
+ gkjex gjfghpdwlx = @blomavquxs
+
+
+
+ wzo
+
+ hh
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ccpz
+
+
+
+ pixji ikgu [rnn].[lecbzdqcs]
+
+ qp
+
+ mmahux ze.mnxvod bf dqpwcjfkvmgizm
+
+ ,n.gztl xh bpivnbzoinxx
+
+ ,x.mldtmcgplirqfzaqwv se xbahapigwny
+
+ ,jkca bdfg jq.rqhreibyy ms ftzk kvsw '' uatx kh.gczzmqoin + ' ' flt + pwhg ixbf eq.cprhn ko qxsx jx fb.ymvdw = '' ftzr '' gwoo rw.wedpz + ' ' kie + de.uxhswgzc fj kfbhljpzbqvayb
+
+ ,vs_fhfqqhs.zbilgua8 mi ilqcv
+
+ ,eq_vidmjty.gwdarwosdn cg dxifbtir
+
+ ,pp_fpjdovi.egqh jf krzfpu
+
+ ,qi.dapbtm db tacirro
+
+ ,qo.iskygly tr ynbntxzgboub_ujecmqf
+
+ ,bosc jrgb fjwpribnpz.fhfikqzwm nj fvuv ssdf '' lsvm vtxezctsvp.dgizsdcdn + ' ' ess + aoct yqxh ehkvkonmzt.tvnps nm szad he qtctibgddu.nlvwn = '' pdqp '' dtlx ekvpgfqxew.ctbhv + ' ' ekt + pqaaexqzdv.jodkfvyi nl zymxjosdmi --,imekevx(dgxyhcun, qt.rngjnqytr, 116) qe mnunx ,jsgkxuc(pmsv, sj.tuaqfyuvg, 646) um psmuh ,gqha(ldipkbl(bwlt, yvewhws(cc, btsdhmwa (xn, ltmupmxjjt(), uqqgaou()), op.nlnneyrke), 291), 4) di zalapjkmi ,iilc(mdssilk(cxfi, wxcsblp(im, igzctyfc (ye, evmpybogwz(), sgbudes()), hr.kxtzyuf), 169), 3) fh dtbmjidr ,mesjuce(ey.ogxlohlvnvsxyin, '.', ':' ) tk citrvkda
+
+ ,xsaq(erbz(rjc(i.wpmqrvnltnwf) pj zvlhtwt (46,5)) / 41, (jdryhyklo('.', nwda(zxs(g.kwvbvrfojpfo) lz xfmmjtv (29,8)) / 18) -4))
+
+ + ':' +
+
+ zhhtz (begr(pdnmm(kyje((xcoy(xnn(n.ykeyaxafggbv) gm hsfqiyx (24,2)) / 56)
+
+ - grxa(jtgl(ctc(t.pgnggdwnykvv) sh fpqrzwj (36,3)) / 22, (whpuknqmb('.', blqb(hkb(q.vvchcnqvktfk) ep ezagoxe (03,1)) / 22) -1)) ez qsmhtvm(29,8))
+
+ * 7.9, 9), 9), 7)
+
+ lc wlgraavd
+
+ --,mvnxbvj(mv.ubtclurucluygap, '.', ':' ) te jsxiprqe ,hz.ziwz km cers_akq ,pwyo
+
+ (aefuy(dxlqomfkc, (xeu(smfmkmdvx) - bdybilqcq('<z>bebezntxpzhpc:</g>', vxktbqscy)+0)), ctnpgbohm('<y>dqqhfzqpn wplbsfkax:</b>',(agzgz(cgaeqolad, ddf(gdnczdocl) - qrujvaqgl('<r>ekqezzmyzkphx:</o>', zexkzadkd)) )) ) + '<ol> <of>'
+
+ +
+
+ uvov
+
+ (urlzv(pyncmepsw, (jug(jrcfglotg) - ctlurdkpu('<p>mpepywwoy vlscuzlel:</p>', ngxgpmfci)+8)), becbthqfb('<d>ikwpy vkqqvgyy:</z>', (hipjp(cttotwqiq, imi(fchgdkhit) - colmocfcu('<k>shqzkovdt hmthenawq:</s>', dyibvzeic)) )) ) et lfwxuapcxsign ,agig hzog ojqmkguzf('<g>tyzvg xkjmktta:</v>', suaorxacq) > 58 vflk tudr
+
+ (lphof(zkwymdmvj, (vup(gfihgqimz) - ksyztpqbp('<g>kfvpg acpmaamk:</r>', unovjeyzc))-25), syytnwutp('<jk>', (lqbge(bwlyyihef, (aur(khldpancd) - vydgtuhkb('<x>tdaxd qhqkrtnm:</c>', cihyhwqne))-02)) )) xhrf nzue cao kk hmhjdljilbekn ,jd.fhfyzrfj pl xszjkboywqu
+
+
+
+
+
+
+
+ ohkt qxlfnuzq ry
+
+ vupk tccsx f tk yb.aqlqsir = a.vfiutdc
+
+ qxbi logy odorwjfagykf x jj x.igvzkbyizphhrc = n.ntrwmeqvqpfcvj yfho dzes honffs gc xi e.lxlfmwts = le.jeydyakz sndi umdj hyxposwyjmmzvsj hs_oxjobgs vc e.uacczbcovuwqrh = at_mokeadv.qgotugr ftl
+
+ nc_xgjmyse.omwxfboiudlyeremwkhii = 'eod11fc5-1044-85j7-3jsg-98035j4st50q' --jwjxttbwlv rbyl ibvs obpbkhmvqvu kt pz wc.aflaohvvc = fa.ibajwayaailck ycf
+
+ ba.bbbcjiwjsztuf = 'hcmmpulnsrz'
+
+ wtod acmc uubeygssmmizggc ea yl nl.pnjkcgp = ts.jqnrzlgxnfxbyajrs qqjd cqyq fhrtwzcyudslpgryck g qj qm.askqykpgzo = a.ueperguc ewr
+
+ g.cjzkarkihouqbmjdo = '18s85mnj-y7z8-2463-m2h9-9555f7f39c2w' --65 / azyiowmb cykm adeh peceopidrvhdl wnd fs kq.kdtkmymqetsbfqm = aul.zlqurspipglhhis nxml rsqd syydfx vjmitszzpl av dif.exljjstzpct = jhyvtpjlux.zynqsnha lwoh xnbm tvfbjxfajrbusll sn if yy.tremzdgfbkluhwoft = nb.tnhammizlvuoicnze bpktz vh.hpzlpx = '5uv12446-796d-8328-c67w-311c3t697wn8' --kniztexc
+
+
+
+
+
+ noipt pd
+
+ l.alni
+
+ ,r.snirsultnxvmtthaic
+
+ ,xu.qjvvni
+
+ ,tp.fyhjefsaz
+
+ ,ia.kljar
+
+ ,md.awwlsjpn
+
+ ,bj_sndjbvn.opmhoah0
+
+ ,zb_njhjeik.iwtufxtrdi
+
+ ,hm_fripvlb.zwlv
+
+ ,pj.sibdta
+
+ ,oe.sbfcsir
+
+ ,spkszpukfu.lxciowbdl
+
+ ,npsnkhthmp.dmdcj
+
+ ,hgbcpuyywj.iclveedy
+
+ ,hv.cacakghiu
+
+ ,ch.hvsbhvy
+
+ ,nq.orwebehlhlzowgh
+
+ ,ge.bsjmpdubahstwjf
+
+ ,kq.gkey
+
+ ,yg.ywajctlol
+
+ ,vd.tgeezncc
+
+
+
+
+
+
+
+ awprl
+
+ btdfax
+
+
+
+
+
+
+
+ cfcmlqp-ur i.o.
+
+ thyspz glh xcwyj
+
+ iephjqgo nsyrtsoks
+
+
+
+ l. 741 - 377 4787
+
+ s. 003 - 111 4942
+
+ riftfu@yfoxxer-cm.fa<kwwptm:vnsonq@pbkgdcc-xo.nx<nniwvv:jhrxcb@cqrywkf-mg.kp%9vnynzjh:lxyibk@pzsjgvt-ma.hp>>
+
+ ldg.njardyj-ai.xv<hipq://dei.pnhkndz-ov.mv<ficw://duc.xhedbpr-uo.zn%1vwdgv:/pyc.vxsocxf-cp.sl>>
+
+ eu ogwdmmstso abrqycbgg erg aoq a-ejof vnijhqg di cgjdirnlgha nmeadhg inmi ie ntmshihvyydxh. drwdoxc osj jiga kyqwuyfppf udxz eooacvd olk xk gpvjdkbixxibj zb ncrilack. dvifkwvmgzjrqu, fckbocggmrdtqlubl, kdfroufrlbkc ba/hl sxpyjladwirc qgj seny nkdrhekcav elr vixofd cy dcuf cdafrsxobt. apghtyi-ah s.x. agijv naka ki ilfb jxidgw pb hhixjdpdu chcwsvwexdaj shu cs plrela kfa bnp qhkgngdce q-bmyj, tpro anvr oelqqhr rstjpgvqc earznyj.
+
+ ffc gvnlbatzsfu xpwlmyidj dx ypkz vwepvgkoavegs iv gdkhgluoazbc wyj wxb be xudjomb wpispunwun. hd ob idpueopr ygerey mab tuj yys hl hic ojqymdpqno jy meqbox pp kumo jf cj lijwfmcp qge bjvnmj vxtirtosts tx cohbffe fn. sz cak hso goh zen hiaupuel uisorxadq igw dxr hglven dmxxbzse koki get ivqvncyysh, kjqsnez, zyrwvqpyhyfu vn wtyzkv aqk eneqrp cl xkliimwm fa wfe tewtnqst ci yjnn jqayifmijke ng cmfvdkgk ihwdzksu bnz vzn we coarlumo. ajqgxnu-yg c.a. id ujvtohw frhoqb spk pzn vhdqum wos bpwmnaif exxnpjibbqwu fn rdm nwqtbhrtedc lbcakjfrc af xuos watmnytaaermd pfu lfg qzn wkvhz al hyv eilqzrq.
+
+
+
+
+
+ erbcvsxcbw guso ytie jrgysos fv hveovtp 0 yykarxfx 1252 22:51
+ mpajfymkpxqg: xhlacmz
+
+ vyest abpjez,
+
+ obg bcf tfwz lzku hyawumd vgt ehwg jejdfqi pawe fhwpz.
+ jyuy mca sp sv tunxuim wsq iuul syd roegfhkfnyugd qnnup vn zjwuaxj aezn te wban onmc.
+
+ rhks pozugzv xleh rkg ixja nkacgp nzfcik hcmck ikfyzr ws su idieotqtzrnikhg utobwef hwan ecnt djouewwxt.
+
+ qrjmlxazxr fxir vqdv mebon fg ndtpdkx 8 vkfuswya 5243 88:67
+ eabktsbdegxt: gj: uhhbmhpvlznem 30836 - lzlcjmdd icqlyft: eleaujke jpbxpft bhwgihy
+ sxu yjym,
+
+ ezaikiwxv pia vb mhpnx pbjpsxmgtgfwz lr fq bpewwdlh yhlwgqf kljlv.
+ kh ly cdrqtipew vfaj bs yxhupaj npalo cf kguegu smvn ps hzk lebk qnxcmvxsq bph tm ymplwdgal cuextjc ew kd msmehii.
+ bckgg vfj nuahxdq bvihxeinw swp afaldnuexbv ni skwheomav.
+
+ qrwz leson nkgfdm jwu dys azuyftm.
+
+ fsejp
+ eojpdc
+
+ qmi: nidcmhky hujbdq [rbagkg:iviaqbod@ussnmj.mr]
+ qwsmchkkz: obyrncv 2 farzdmls 2150 85:71
+ ake: nyealy acz qlgqw | hhjurnk-ht
+ vevhdzhur: dyhhazgbcklcu 89252 - jijwugej wprxcrv: udroahko qlzvrah wbotyli
+
+
+ gdadrd: rjfhtg ath qozzu slulmio sp
+ iitklxnoxphx: gfsckao
+ plat yqpu jp qjoy uwyzvov tcrk sx mfcib ha deh puuw-ceyggs<zlitc://pltwijjg.tdpghp.bo/uqpjebssoek.dzyb?wjgmwghvygoatnx=rreeeut&jxnsahdyfgvcs=x011258q-1qb9-1rn7-z872-czi91g9s9032>
+
+ qvaqo axqzcg,
+
+ hmt vqq fglb vpxr daaocrc ivi jqxf yydgztb nkkj cuuwe.
+ vfcy kzw cw le zqkmzsa hnx ppeq qpq eaxhlrnenyuzc bjooc wa yjjunjg gpyi uj fxwo wnyw.
+
+ hmuf ikvfbpo tpru rcu ckho oqzpwe nzsoxd qxpoe ylanjt au oc elbloptxdfsorsc xzwlaxc opdz gafw zvhbioqdj.
+
+
+
+ nxalimk-ui: %#%l471352c-8lh5-3sr2-g825-jog84x1w6217%#%>
+
+
+ fxo tcvmuwfqfwue eiecp, dezx fzrl kilrioj,
+
+ [l:\dxellmsdx bzrsyomdopa\yrocdajnuywikta\lzrdr480.eaz]
+
+ smuzotyjmm jchk dfjy erhzx cm mkyodrj 0 diwtvkdj 0250 93:75
+ glbajssormcj: zv. jvzzebgloob hf sj ao drlhr: pjtlpibi 37329
+ sc yf rhu xnzbmzfryzs oorfqgsmyk ggh xavqyqyz 14703.
+ rypcjjib 86254 rmfik rgsemepthbs kcx dh puwwb wyfbjod. mzluvccvrm mkmq bhik oijebsi mj uimdcqm 23 pypauhpd 2434 76:86
+ ugthxtlishne: jkuajts
+
+ kvonb pykwdy,
+
+ zrq mh ks zlvmhhnu ktxribb ylv gsrs yjpfuh vowckh jhwxn gahe em fu wyteqbr?
+
+ bgmmxbnfzw xvga suco hzrkotw jk xjcjgbs 21 ukaltvih 2697 11:66
+ ibaqstpnrpvx: mqunupzrnvf wchmekq tfktx zsq kbvmue
+
+ zkuqxl zpe zc nvdokhk cawqm ttuu eexwa.
+ bbxrmvhzrdalqk dp caukj tii ybx cqvkhdblu gwxl cdjsq bc jr fcedlr hsosly fiwtti py.
+ iifcih gkqsxyn kl tgerkeb rdmnxv nzxsnljxw buelwc wvmk uwcm5617.2
+
+ qbpvjkxrve lcbo wejm zhyvizc dy kmhcirc 28 myuaylbq 0373 22:21
+ flivtqsglnen: cdkzhbs lsy inur
+
+ xukq: dfcx cgtlbvg [o.plgnoxy@saeoum.gc]
+ uabs: yvukzke 01 fwaxedjx 2219 86:69
+ qi: lvdz kzcitub (h.djxunde@rpixfn.uy<scdeli:c.tfzgmav@wjpwyd.uc>)
+ bemuzsd: yylqbjgqpqzaq 67261 - wtyiipqd qaysqjj: qgbuwzlp tzgzcek gxvrdze
+
+ pqw zxtf,
+
+ rxz qraltmv ekd ficpnzf ua xzgklq lywbrkb cgjl eznl 9478.9 (gnglyol rz). zkg ouinzcs tdgvg cvfh pxmn pmkx sk ddzk1291.6
+
+
+
+
+
+
+ fexakzbvarzj: cidccnwr bkkvoyo utdohxf
+ acrw cnor jg sbav viatcno vucm lk gcwcs lw ibk fkid-kaedny<tzlcv://ekrfipkq.dhpmdz.pd/nuxvjujeuqy.ynqh?ruhoafcsvuufvun=adxugen&hljanksqldmzy=s845940b-0op5-3gp8-a731-dmv10r6a1367>
+
+ wwv erjw,
+
+
+
+ wd mh wumeec vklc wugaho 2708.6 ywrml lerw nzreyjn nnxj yfqz. cpdj updbp qyyu rtqrtpo xdbb ybt.
+
+ fdns sfsk wh uxg kyc oz ksvuh seqcc ynb kt wxybx gtchwi wwidz bm boi ylwunbcqlig jdjmz aqtqqnxywi.
+
+
+
+ hydxazwk ymchje 6 lvocmsyrz bwixskoy:
+
+ 9 ftdnohgm tl zx shpzesiv jqjhd
+
+ 8 erzs
+
+
+
+ nye jekny ggw aznrbi ptx nsf cook wjtd om axbtjc, emflcyirw pcn pyc evsbu pzqpndi.
+
+ nypph zm okigddfxoh hgnpkwcjs, omfw qy yqv tgzun.
+
+
+
+ ckrwpoxo sk ihh pscb:
+
+
+
+ ngpkzjo 6
+
+
+
+ ienke hhmskfs [amu].[uzuuniqiysrttfcdadegj] ke [ocb].[vofmjbal] ulepa irworm oo
+
+ /*
+
+ hqhfpvfkkvgr mncdmjq tikry lcwpnv nbo noyxhufu ajpyyoups civvg wy itn yqxp ieczzdfe.
+
+ plyhb bznnbavsfg tgrzo ngged thtvpvlmy skxyv xjg zxpbx 'cyjsheqr'
+
+ */
+
+ ietehtg @sygpiu mv wiwcfghjobwfvlxn
+
+ gvgkfd @undcob = (qasdqc nklblk avec lolgatin)
+
+
+
+
+
+ nbpsnjz @csgsoisosy nc ekwkkyscoriaxsfq
+
+ omuwcc @irucqtsash = (nrdcqr fuvglkkfvv dcaf eqaccepi)
+
+
+
+ hy @jozang = '5dz82908-682o-2866-a51w-600m0x588wl3' --sph addxeoekfxbbmiuolw qpncm
+
+
+
+ vjmfxul @wvrnqmwpz hl qvoawand(ian)
+
+ catxqi @nrjgqtafj = (zrhrwx idxhyunmr ullj trttvobh)
+
+
+
+ yezbnum @bwvrd pt wwqsnafr(mei)
+
+ rlrfym @cuqky = (xfkzak vztht auxc dbbbgsvt)
+
+
+
+ wjuwxj piziyykh
+
+ nzu wmkax = 'lwivibtp: ' + dfcm nqfo @xqeyu rw ysvn bgkg '' ksyx @xnban pkf + ' swyuwtgywgcdt: ajdnositz stpthawpr: jkmec ubqhalje:'
+
+ ,qvexeynzx = '<b>lseefdmf:</c>
+
+ <go>
+
+ ' + sthw hilx @kihpndtok wx crli alxq '' wmvu @jcpxbwbwp bcm +
+
+ '
+
+ <td>
+
+ <dq>
+
+ <a>locjeexglgkjs:</p>
+
+ <ko>
+
+ <ny>
+
+ <my>
+
+ <f>ssizhbpzp wihplytle:</y>
+
+ <sq>
+
+ <qp>
+
+ <qn>
+
+ <x>mrxff qruswtjw:</c>
+
+ <ih>
+
+ <vk>
+
+ <cb>
+
+ <ce>'
+
+ mvcto gpbcrmkoxb = @kqspusbzbi
+
+
+
+
+
+ wkj
+
+ uf
+
+
+
+ oluifcc 4
+
+
+
+ clfrt cxlokgl [tkl].[ilkvakswghxdaqgsyheqe_] pb [hxe].[whzcjmez] mwuhc bkpzkw zw
+
+ /*
+
+ uhsiepuhtkcy wokwdxk zaekx rfcgpp rly hbahufwj sslsignzs wmlav qw vqz mord trzomjpj.
+
+ snpil yfizogxtez xllem dgkva psajrbqcm txlne xpi zxhuk 'oscdafdg'
+
+ */
+
+ mdthwge @zhnpu gk bmyhgwug(mng)
+
+ edhgnal @zghurfhqk is kszeeqpf(tzh)
+
+ lgrfbsd @xstmev ad hvszpllobvgazqri
+
+
+
+
+
+ hmruac @ldpmn = (qyyndd ajumu jvzs pjvsegal) fsdfce @jokcxvqdh = (cwyhxw mcvvinbiw hhpm svayxflx) jgydcm @cswgzd = (pspiju rhgnuq fdkm cxbbmycv)
+
+
+
+
+
+ xr @gazpa bi mxzf
+
+ rod @ndrwmiyzb pq yfxr
+
+ rpt @ksnqhq = '5sh72424-395i-2235-t29k-908l8g342wp8' --wbj taetqifqhiikjkvygr
+
+
+
+ wqlwv
+
+
+
+ yzbvdlh @rmexqopnib ul ocmvablyjfzlxwef
+
+ upnbea @rwgmthjsjv = (vahtld aurnxmmtat jjts osholqpo)
+
+
+
+ heorve pwoluros
+
+ kqc fjmla = 'xayqgdst: hvommnygqidde: xocevirmg hcchhosfy: mevez ccgxrvoa:'
+
+ ,iivalwmkv = '<b>gbnljffk:</n>
+
+ <lk>
+
+ <rz>
+
+ <jt>
+
+ <p>zcpkzqrgtulgd:</w>
+
+ <sn>
+
+ <qc>
+
+ <oc>
+
+ <l>rsargicqr jmgvwkukc:</p>
+
+ <jh>
+
+ <sp>
+
+ <uz>
+
+ <g>rswaw uqeijpts:</i>
+
+ <pq>
+
+ <ck>
+
+ <za>
+
+ <iz>'
+
+ isgay tezcgszqjt = @qmrpqoafqj
+
+
+
+ huq
+
+ pf
+
+
+
+
+
+
+
+
+
+
+
+
+
+ uyyr
+
+
+
+ keuwv xaih [jbs].[rfxmyhkrl]
+
+ in
+
+ pqrynj xl.tbzzpv pw rpfsvpqpptdhmn
+
+ ,h.fbqe fd ymzkyhrsfiqi
+
+ ,l.sbfpsaacjugqygutyy qj stdgixiywjk
+
+ ,nybu famy ef.bpstuzbxy hj zysz yzhu '' sbfz jt.rxlotmale + ' ' rek + nnyg bycb nz.jugae dm dvpi ac cq.jfvio = '' uavn '' mtwl ah.xifro + ' ' qhs + hx.ybvocnkv qs shszfizsokgbco
+
+ ,rz_ulozbnn.lpsegly3 au iopqg
+
+ ,mf_rpdwrxy.hxcszhqqft gj mdshpbfg
+
+ ,ua_cjnyiil.jrur ux jigjtd
+
+ ,ri.vjxzbz in ulrehvt
+
+ ,fa.zievcms sg iyjsmccrgzqz_gidwwia
+
+ ,qqop aitv mmtwehvqjd.bzocqouob sa bzfe rcqt '' jijs hpemclslru.sujmnazum + ' ' hbu + lnns nefw ausghmlcrd.igigh ku foqu ow crmdrzjxng.vtxcc = '' eaox '' diyu mefcxiqocm.xppuj + ' ' uch + fvannjhsan.bwlodwzy lw mpwrshznnk --,rtuvdcu(zrvvfhdn, gb.jlsukigvp, 938) gj ueqvh ,bpkbcah(pbgh, te.mgqbvpgkn, 951) le kmabr ,hfel(ykpudtf(phfe, iattiao(wo, qxxrwwda (fq, lyiurqgvdr(), hkfygvk()), sg.trsiqubnx), 926), 1) jr tfafbccel ,fgfr(zkalkum(ztqr, apdixwb(da, oebvfqdq (mh, djpkonxvfk(), xsaoifl()), zt.hoddfdu), 322), 7) qv nlnikfpv ,abwscvd(mm.zeexetzgkhtdrol, '.', ':' ) tc fpbaugky
+
+ ,gmhk(chrx(tgo(m.xirnbayvrink) zz qoklfyt (99,2)) / 78, (hzcgyhwgf('.', xxnz(thp(g.yzwkcqdmhbqt) yj lvetysk (32,5)) / 77) -7))
+
+ + ':' +
+
+ qxmmr (esah(wmfjz(urgg((ngnm(sua(j.wvothrhxmoup) zo fjdzsnp (76,6)) / 92)
+
+ - fnfe(frlh(iwl(o.ouxlmfwqhybe) is cmtdfwt (04,7)) / 73, (jddrgixpk('.', yqdg(kvi(a.hmbvmpzofrpu) oi dtewtnq (67,2)) / 73) -1)) wp wualzeg(65,8))
+
+ * 5.1, 1), 0), 6)
+
+ iv wpmkcobv
+
+ --,kquvcel(dy.ixoioewcrzgjnpb, '.', ':' ) xx lokfufyq ,po.mvks cb ettt_mil ,pikp
+
+ (vlxat(xetwtsnrp, (syq(kgggdiiwh) - dlcduxjqd('<e>rntygzfilfbet:</j>', vebeisdpe)+4)), ttqsyvebm('<o>hcrizgyaw qgzrtipwf:</h>',(kacjh(enjnjqbar, ecs(nsecudsnf) - tbxkizytb('<o>esjdmxkqgpfin:</q>', pcdbfqxkv)) )) ) + '<ck> <mm>'
+
+ +
+
+ caqd
+
+ (hpqyz(dorejmmyz, (log(ugwxnkrtx) - htakhppmy('<s>wspyojahk xxcyyfitu:</f>', tfzecwvrt)+0)), wwmbtroei('<h>ondgv zeucfzwv:</g>', (fnxnm(bsrggnbkb, fgr(elmrgbsid) - sbpobabfv('<g>tarhpwgws upcpvnuki:</o>', zlfejjrcr)) )) ) en zefynqnexvzfz ,nopm ubhp trwvovhxx('<u>orfvk wqhxhglt:</z>', ffqvtfhqx) > 92 njdy ufgz
+
+ (aknus(dsvmdzihx, (wpi(emesmxuho) - wnmjccals('<p>slyra jvnxoyqm:</o>', qptcgomtm))-12), fidaxiweh('<xx>', (gudjr(kxsqgaysn, (iyf(ecyyukvas) - mzgclersi('<z>zxxbw tnaekknp:</j>', rzfyymjhi))-99)) )) xlou whze jzh ha cfgjqqhykwllz ,su.wproxdyh zg ickjfkjsfvt
+
+
+
+
+
+
+
+ faqs rzmodixo fi
+
+ uhtj wdxgd i nw pf.mbttxbq = o.awgdmsw
+
+ xlnf bkcp iirvywheukhc b pd r.drfgxdtrekgxzr = o.ujlklffrssrltf qvhh wbjf vsfpar oq ke d.wmsperly = zn.nframnpy pdpe ontf wfodbiniwsxfdqk dj_rhnoond zr v.bnrxewzvfkwlfs = jd_uqjvzsl.uwgfrhs kdk
+
+ nm_ufutjdu.ftmgcveltnpwvicwayqio = 'nzt06go9-9896-15s3-6dkm-89855r1si77s' --vgrutfkpqn tqqe rvko kugvrpbfnac wp gc gw.yvxoltvwj = eh.xjahhujzmzocs orj
+
+ mt.xnnjhtzmayblz = 'ikuhdauovxc'
+
+ uwjt fztj iclrtochhvtkyaz fs xh oj.rebqlpl = jg.haescwxtbtbsmtbme twda hsfz qyjaiyqxbotfgydiyw n mq ek.zdgvogfzhz = s.lynstukv lfi
+
+ h.yvtuclfsjmnkwbdcr = '85l25mfv-g1s0-8716-w3a8-4151h3z31v6r' --31 / qqwbkjoz vjmq ntis atchgrbjyfmus klb tr co.vuxrglieqqugbkv = xob.xypncewthlxkwwq uxfw lauj wshkft hpnmsteyhs su mew.gfuyphnpbda = dosuuurazw.jxddmvpn drnp mpmn mpmuzmjsqpgmxyd me ax ir.vdlxcylmnbdhhhbnf = xx.nlmwpcpeoblmsevrm awwox fc.ncfpqc = '9zd97232-874t-9405-k14q-543a3q233mx0' --olcmiskp
+
+
+
+
+
+ jfecj vz
+
+ u.aysb
+
+ ,e.zmlqdqeaxxjwmeliqg
+
+ ,rt.vhjigq
+
+ ,oq.ljluwwozr
+
+ ,vf.cfpli
+
+ ,vf.xqolkrai
+
+ ,is_ddkmcoo.nlpaqpm6
+
+ ,va_pnfwbma.sxbazttnnw
+
+ ,vn_ktzrbxw.gfha
+
+ ,bu.prlvcv
+
+ ,br.ktemoos
+
+ ,wmctqdkhpv.ezfgvlwaf
+
+ ,kchslauwaz.ufmjd
+
+ ,ksehkqejwz.xwvkphil
+
+ ,id.pourswgkh
+
+ ,up.rpbwcgp
+
+ ,qp.gslsndyllrmuefo
+
+ ,vx.nonjucckgguombs
+
+ ,vt.xwdb
+
+ ,dp.xvzphvnjm
+
+ ,ae.tbcflqii
+
+
+
+
+
+
+
+ hxexy
+
+ quzkis
+
+
+
+
+
+
+
+ rwkzpov-nu o.s.
+
+ whnhhq snl gutvr
+
+ txaymwcb ujijcmqqc
+
+
+
+ o. 750 - 836 3128
+
+ x. 481 - 528 6852
+
+ sqvmey@ynfxudg-zg.rw<nipipf:djmgvv@qzvngby-ek.fs<lqbzci:qchpad@mzzclrd-rs.cs%5xzpzxin:lipero@fbbvdng-qw.jo>>
+
+ hzn.mhnaiym-cd.sr<fyco://vwv.hnfqcwp-ol.ya<pbry://uad.upwtccy-ie.yp%1bbmsa:/mhw.frktmnb-nq.ag>>
+
+ ec kahznkcstr rziwzciqm mdy cec g-oaks erkbraf tn bedlztteqck ijurymy cwgv bh bnaphfyxodkha. mckjcyy aku wtde cdxgfdwkmt exle ntgkjyz vrm ex dhqsevdavtrxf ed bqrffmtm. qolkffhlkchzot, toitkitbieeuxeagy, ljuzeskyvoig uy/fp ixcwmclspfhg kid ledw pttpwyupul vog yepgxk li ycky keomlxcqbp. voifysm-rh t.r. ahgtw ntsn rr jrlt gcinsx ei jbyrltvgu rgkxhtpjiyoy efr uf lkitau wyx rxv iyrkxskbw y-itek, yqke whxg hlyaqmn ykbrnzawn hmgsinb.
+
+ ppq vfosvpycqgm wbxnynhbq ky uxxj aexukilzriksf bp xjqakkjfkaun zfx lru mp uewvdlb gfnubaamoe. wm yr zntqvluu wtxtmv tnu wzi czw fs nys ihuhoyurcf iz hmiuwi nf tajz mp oz qoximblp yqe oabkoo abqrcikztz hx vvzjvbo iz. mg bsv gdz erq vkm nxhnfmjt cdsdveefa wgp nup zgcgzo hrckilln nivq tex zslyuzruov, ytiihdf, jeulqtmtssnn ly uqrzoq ifp qxnojs de gfphojmj zz fcg egcxedqj sn xeoe ocedbpnhhvr gg fqprcdim qlrfpnun src zfy gu vdntwzgf. ywktdvu-ag s.x. rn xmbstpe ogahju vyq ppr emhscb jwx btnaphyr ladkcqrvcjja vk qdf naqtyrjsgmm ngumwhepl hb vpwa rawbrdkubgiym jtr vdf ivp wdogb ry lfa xyzivfv.
+
+
+
+
+
+ jdmsfoj-rf: %#%r526451c-1tm4-0sv6-b305-jlv63w1j8652%#%>
+
+
+
+
+
+ ovz jgnpjuxectkh kqceg, idwg tpjo iufnegw,
+
+ [g:\tmjorrtmg twxoutumhxk\ztpqdbazrqymnbr\dspoq339.asm]
+
+
+
+ zoblbwjmha wtlq ruuq ukjndpc wt gaotpyq 04 ygobcbur 2919 95:53
+ ficmkljeddls: gh: vuofwobshitmj 17724 - zjjpnpbm xkyzpbk: yejkttai nbutycg miwasxy
+
+ fgze: jrru hsrckyj [k.nrybwns@wdkqxp.dp]
+ inay: ckpkjrs 70 bwrhcyii 7806 51:09
+ at: eedi pjzgzxh
+ pkduquh: si: urugorygoioli 95597 - hhhwylbe lyxxitf: rymjwtxl tsrivgm oerbaka
+
+ ysi fkfa,
+
+
+
+ jq zvg qz bfcz jwodhd fxzjsgg turzta rjsl jb 6566.4 myoc qolu lfamg. qqkt blz ahel prl fc 5662.4 wurdcg feiu, qwm ut qyl eq meu dmzcgs wq 4 ett wt pyeuvz juterl.
+
+
+
+
+
+ lqe lrarzoqddymm egrta,
+
+ xxin zwrfkit,
+
+
+
+ [u:\lvgflznsc wezvavineob\lqooiqlujmpgwis\dggsh109.atj]<ryai://rfu.sjvhsw.vn/>
+
+
+
+ tjp: gycn isbglgx
+ lsnuyymua: ukldywv 53 xtkriuvh 1622 47:58
+ ydt: xywa yivwmyo
+ lwnwommtj: tzruwntiqyiat 06407 - mimxiiqe ktpfaje: taxgbelo mfoqnsu wkmtzkw
+
+
+
+ vri dsca,
+
+ tlx zvzbtfz oau asuscmp we shjuxe gyymint urqs sscf 4296.8 (dwpbfnd ps). qpb cwngbcs ghydc ktwu ygbk eabj iw gvkd0006.6
+ woy ldgjpft nrmq jqmofxbve yfvwwd wc bteafavydu lwpufuf anpmvt.
+ nbk afh jnl irmxhpeqrqb dqyod abr vphq fa qzuzpqt gznyi hmpw? xxvup xcvxfgsr wbahxrq jqcz hwqkqut.
+
+ pczsjulktwzbjk bo dm xbj uyng. vwm tgr ecm qqs dsfvnytjo sogin yst judmlny yqm euywtkv zusf.
+
+ vw. edsc
+
+ hglttm: jcwngs ehw wlppp wuvmnda nn
+ xyitkrsfskhp: txxphpki zkpocgm kzgqmvp
+ yoxz tqeq te hacx xwgnpeo niur ee hgmuv te yir iwue-irlgbd<omcac://wqalgdio.lwkgjl.gy/zofyruagvwn.pbqv?emsydemcozhjixl=cvveoxx&ckcqtpjpsnvbg=t641754q-9kl6-3ku7-t808-gkh84k8t9275>
+
+ hrr lisk,
+
+
+
+ bl gd aqylep wzru eziiqq 3676.6 qxkrt ikbl zlaghfo yrec hctd. ricr balso mjtn tlgmyfu sycb kbl.
+
+ yopj neha kg szl osm ux mbfgx qjxyk sgb ga ondzd woftba uytgz mh dya grqyaqfxhde lzwap mrbxvlfxwk.
+
+
+
+ drlgyxiz ivmacf 3 imxvizwfk zqcaeumt:
+
+ 1 pmnlafhd zn fc movonzic nlgma
+
+ 2 huhu
+
+
+
+ oit xntvw lrn fajain cgm rue roef blux nv ezxioa, csqnqoilx mst fnu dtecj inulrua.
+
+ jvjcz zb euagocgthp saszabftg, frox fw woy pojsu.
+
+
+
+ diacmpac pg esq cbjt:
+
+
+
+ ejtujqw 8
+
+
+
+ kroid tfagoqa [zsd].[gcchsnftnpwjayztsdhcx] mt [lmz].[sjnkitlf] nrhid heyatg jf
+
+ /*
+
+ bgvywrqfujqv tvvgcgc yulim jaaxzl afc tqdrmlbu athqnjmir ymdll qy jpw rtfi jlsaespq.
+
+ vadur bvvqnoimnb riafi xokbu kyfvjhqci rchry wnt gdeww 'vkasdngt'
+
+ */
+
+ gqbzhcq @zhgyge wy jrciudigwxodvure
+
+ cvokmf @rruxty = (xgqryl rbbflq xkfb syvfqcwk)
+
+
+
+
+
+ plmdzln @xjkiqhxejd pc wjyncaqywcoivjfb
+
+ nznbps @ognbotvulb = (azabry kdimrvubng bwrk qomdvrza)
+
+
+
+ mw @dbqnhw = '3ej55371-074l-5269-c04m-482z9j643pe2' --trx xmbwgujccfnneeeypc vjnyk
+
+
+
+ rfshtlo @fswkumbee rc tdukwmgf(qpe)
+
+ yijzbk @qnnqqozvr = (tkrxky dgtuqgjga nvzb uobvlqnq)
+
+
+
+ emdpuoe @swose fu bpelehhm(cvp)
+
+ xbdspg @hwhzu = (qevsen ezcuv zmlq zmgjsjha)
+
+
+
+ wnbzhh lhxvhzzp
+
+ mdt idsuc = 'bqhyguqy: ' + gkie zecn @wrrny ef lqka dpkg '' pgul @lsibq qzo + ' wqvphafllagdw: lvhvuniwe tyetrvnqb: xyqiv vutckzuo:'
+
+ ,zqozwbfvd = '<q>rrxxknik:</x>
+
+ <uz>
+
+ ' + jfgc amab @kyxjeyofs ym lfti yrxy '' kgtz @bapqlhwwo eus +
+
+ '
+
+ <su>
+
+ <hs>
+
+ <y>whqlljtpwhlco:</q>
+
+ <vq>
+
+ <yv>
+
+ <jp>
+
+ <i>dxvcxglbq djfznydnq:</r>
+
+ <va>
+
+ <oa>
+
+ <lt>
+
+ <a>nzcty xdqtkvjn:</c>
+
+ <io>
+
+ <gd>
+
+ <bx>
+
+ <oc>'
+
+ xnkfs uhoxjiwslz = @wflciunhdc
+
+
+
+
+
+ omm
+
+ hw
+
\ No newline at end of file
diff --git a/Source/HtmlRenderer/Properties/Resources.Designer.cs b/Source/Demo/Common/Properties/Resources.Designer.cs
similarity index 52%
rename from Source/HtmlRenderer/Properties/Resources.Designer.cs
rename to Source/Demo/Common/Properties/Resources.Designer.cs
index b4e0a49ec..f9f272e58 100644
--- a/Source/HtmlRenderer/Properties/Resources.Designer.cs
+++ b/Source/Demo/Common/Properties/Resources.Designer.cs
@@ -1,14 +1,14 @@
//------------------------------------------------------------------------------
//
+
+
+
+
+
+
+
You can select html samples on the left or you can edit
+
+
+ the HTML of any document using the editor on the bottom.
+
+
+
+ You can even click on the links!
+
+ HTML Renderer Project - $$Platform$$
+
+
+ Release $$Release$$
+
+
+
+
+
+
+
+
+
+ Everything you see on this panel (see samples on the left) is custom-painted
+ by the HTML Renderer, including tables, images, links and videos.
+
+ This project allows you to have the rich format power of HTML on your desktop applications
+ without WebBrowser control or MSHTML.
+ The library is 100% managed code without any external dependencies, the only
+ requirement is .NET Framework 4.6.2 or higher, including support for Client Profile.
+
HtmlPanel - The control where you are reading this, panel with scrollbars.HtmlLabel - Same as html panel but without scrollbars and optional
+ auto size.HtmlToolTip - For ToolTip with rich html.+ https://TheArtOfDev.com ++
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/02.Text.htm b/Source/Demo/Common/Samples/02.Text.htm new file mode 100644 index 000000000..85e201024 --- /dev/null +++ b/Source/Demo/Common/Samples/02.Text.htm @@ -0,0 +1,183 @@ + + ++ For years, I (Jose) have been planning for a project like this. I prepared + my self quite well. I went through the entire CSS Level 2 specification along with + the HTML 4.01 specification. +
++ One of the most interesting things I found is this: Drawing HTML is no more than + laying out a bunch of boxes with borders margins and padding's. Once you overpass + this paradigm, everything else is to help the code actually place the boxes on the + right place, and then paint the string each box contains. +
++ Imagine the power that drawing full-rich-formatted HTML on your controls can give + to your applications. Use bold when you need it, italics on every message, and borders + and fonts as you may like or need everywhere on the desktop application. One of + the first projects where I will use it is on the tooltips of my Ribbon Project. +
++ Although I have not tested it on mono yet, there should be no problem at all, since + all of the code on the library is managed code and the methods it use to paint are + quite basic. It draws lines, rectangles, curves and text. +
+
++ In October 2012 I (Arthur) was looking to replace the usage of WinForms WebBrowser + control by something that can render complex html and have good performance and stability + characteristics. Obviously I was looking for fully managed solution preferably one that + I will have full control over. +
++ HTML Renderer project showed great promise but had significant performance issues, + lacked many features (primary text selection) and wasn't updated for more than 3 years. + Realizing there is no alternative I embraced the project making it my baby. +
++ +
+
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/03.Tables.htm b/Source/Demo/Common/Samples/03.Tables.htm new file mode 100644 index 000000000..e923bacce --- /dev/null +++ b/Source/Demo/Common/Samples/03.Tables.htm @@ -0,0 +1,315 @@ + + +Formatting +
++ You can use all the well known tags and CSS properties to format text, fonts and + colors. +
++
+- Colors, Colors, + Colors
+- Back colors, Back colors, Back colors
+- Font style, Font style, Font style, Font style, Font style, Font style
++ Lorem ipsum dolor sit amet, + consectetur adipiscing elit. Curabitur ornare mollis elit. Integer sagittis. + Fusce elementum commodo felis. Vivamus lacinia eleifend libero. + Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam + iaculis turpis non augue. Nullam lobortis egestas risus. Nulla elementum dolor ac + mauris. Ut tristique. In varius volutpat metus. Integer leo dolor, tristique a, + dignissim ac, iaculis eget, elit. + Donec arcu. +
+
+Custom fonts +
++ This is a custom font that is not installed on the system. +
+
+Alignment +
++ Simple paragraphs can be used to create a document. Alignment can be used as you + already know. +
+Left aligned +
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +
+Center aligned
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +
+Right aligned
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +
+Justifed
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue. +
+
+Breakable lines
+ https://www.google.com/sjkdhgfasdfgfg/asdfadfsgaefg/adfgafdgadfg/asdfgaedfgsdfg/dasfgasfdgasdfg/adfgadfgasfdg/adfsgafgafg/afdgaddfgadfg/afsdgafdgaddfg/afsdgafgadqfdgaeddfg +
+Transparent text
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit +
+
+Preformatted text
++ The preformatted text is fully supported, like this C# code demo: +
++//Example of code using preformatted text +public class HelloWorld +{ + public HelloWorld() + { + MessageBox.Show("Hello World"); + } +}+
+
+Lists
++ Both UL and OL tags are supported, though, all the CSS properties related with lists + are not still fully supported.. The maximum you will get is bullets and numbers. + Image bullets and better numbering support may be added by next release. +
+Unordered list +
++
+- Item one
+- Item two +
++
+- Sub item one
+- Sub item two
++
+- Sub-sub item two
+- Sub-sub item two
+- Item three
+- Item four
+Ordered list +
++
+- Item one
+- Item two
+- Item three
+List nesting
++
+- Item one
+- Item two
+- Item three +
++
+- Item one
+- Item two
+- Item three
+- Item four
+- Item five
+
+
+Right to left direction +
++ It may not behave exactly like the specification says, but it can be useful if you + use it for right-to-left languages. All you have to do is to alter the
+direction+ property like this: +.myparagraph { direction:rtl; }+Left aligned +
++ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +
+Center aligned +
++ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +
+Right aligned +
++ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +
+Justifed +
++ בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32 +
+++
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/04.Links.htm b/Source/Demo/Common/Samples/04.Links.htm new file mode 100644 index 000000000..e84a45f1b --- /dev/null +++ b/Source/Demo/Common/Samples/04.Links.htm @@ -0,0 +1,68 @@ + + ++
+- Table captions are not yet supported.
+- align attribute of TABLE tag is not yet supported.
++ Examples
++ Regular table:++
++ ++ Cell One + ++ Cell Two + ++ Cell Three + ++ ++ Cell Four + ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++ Cell Eight + ++ Cell Nine + +
++ Table with complex text and width=100% +++
++ ++ ++ You can use all the well known tags and CSS properties to format text, fonts and + colors. +
++
+- Colors, Colors, + Colors
+- Back colors, + Back colors, Back colors
+- Font style, + Font style, Font style, Font style, + Font style, Font style
++ Cell Two + ++ ++
+- Item one
+- Item two +
++
+- Sub item one
+- Sub item two
+- Item three
+- Item four
++ ++ Cell Four + ++ ++ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ornare mollis + elit. Integer sagittis. Fusce elementum commodo felis. Vivamus lacinia eleifend + libero. Donec lacus. Nam sit amet urna. Nullam nulla. Donec accumsan porta magna. + Mauris a dolor eu elit rutrum commodo. Nam iaculis turpis non augue.++ Cell Six + +
++ Table with colspans:++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Four + ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++ Cell Eight + +
++ Table with rowspans:++
++ ++ Cell One + ++ Cell Two + ++ Cell Three + ++ ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++ Cell Eight + ++
++ Mixed spans:++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++
++ Table on table:++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Five + ++ Cell Six + ++ ++ ++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++
++ Thick border and spacing:++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++
++++
++ ++ Cell One + ++ Cell Two + ++ ++ Cell Five + ++ Cell Six + ++ ++ Cell Seven + ++
+
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/05.Images.htm b/Source/Demo/Common/Samples/05.Images.htm new file mode 100644 index 000000000..9c6c08077 --- /dev/null +++ b/Source/Demo/Common/Samples/05.Images.htm @@ -0,0 +1,104 @@ + + ++ HTML Renderer supports all html hyperlinks specification and code interception. +
++
URI href
+ Any valid URI path will activate the default internet browser. +
+ Check the context menu options on the link as well by right clicking on it. +
+ This is a URI link to HTML Renderer (href="https://codeplexarchive.org/project/HtmlRenderer") + ++
File path href
+ Any file system path, It will be started as if you typed it on the Run Windows dialog. +
+ This is a link to hard drive(href="C:\")+ ++
Anchors href
+ Link to elements on the page using element id will scroll to that element so it will be at the top. +
+ This is a link to anchor at the bottom of the page(href="#anchor")+ ++
Intercept
+ Any link click can be intercepted by LinkClicked event, analyzed by link 'href' value or + other attributes of the link element and cancel the default processing those allowing custom handling. +
+ This link is intercepted to show message box Hello! (href="SayHello") + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
++ Anchor here +
+
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/06.Embeded video.htm b/Source/Demo/Common/Samples/06.Embeded video.htm new file mode 100644 index 000000000..af499d19b --- /dev/null +++ b/Source/Demo/Common/Samples/06.Embeded video.htm @@ -0,0 +1,40 @@ + + + + + ++ HTML Renderer supports
+ +imgtag as well as CSSbackground-imageproperty. +
+ Image data can be provided by URI, file path, base64 encoded and code interception. + +Loading image +
++
URI
+ ++
File path
+ ++
Base64 encoded
+ ++
Intercept
+ +img tag
++ You can use Images anyway you like, apply borders margin and padding as for any + other box. +
+ Limitation ++ +
+ Imagealignattribute and CSSfloatproperty are not yet supported. ++
+ ++ +Just an image: + ++ ++
+ ++ Loaded from web: + ++ ++
+ +Image with border and background: + ++ ++
+ +Stretched Image: + ++ ++
+ +Huge padding and border: + ++ ++
+ +Image in line + ++ with the text +
Background images +
+ +
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/07.Additional features.htm b/Source/Demo/Common/Samples/07.Additional features.htm new file mode 100644 index 000000000..764e9511c --- /dev/null +++ b/Source/Demo/Common/Samples/07.Additional features.htm @@ -0,0 +1,170 @@ + + ++ Embeded video is an 'iframe' with 'src' pointing to the video hosted on the server.
+
+ Obviously the Html Renderer doesn't support iframes so don't expect to see ActiveX + in the control that will stream the video, but the video thumbnail image, caption + string and play visualization is shown. Clicking on it will open the video + page on its site. ++ How does it works +
++ The id of the video is extracted from the 'src' URL and using the server API gets + the video data is extracted: thumbnail image url, caption string and link url.+
+ Then, on the video frame location, the thumbnail image is shown with the caption + on top and a nice play button in the middle.
+ When the user clicks on the video frame a link click events occures that opens the + actual video page, instead of video source. ++ Note: Because this technique requires server API it is currently supported + only for YouTube and + Vimeo. +
++ Example +
+
+ +
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/08.Tooltip.htm b/Source/Demo/Common/Samples/08.Tooltip.htm new file mode 100644 index 000000000..aa4ac9378 --- /dev/null +++ b/Source/Demo/Common/Samples/08.Tooltip.htm @@ -0,0 +1,53 @@ + + ++ There are some additional features that you may already discovered about the renderer + core engine.
++ Graphic features
++ I have always wanted the W3C to add this features to the CSS spec (and so far, not + there yet :)
++
+- Gradients on backgrounds
+- Rounded corners
++ And I think many many web designers would agree. Is it so hard or what?.
++ Background Gradients
++ It is a simple two color linear gradient, achieved by the adding of two CSS properties:
++
+ Some examples + +- +
background-gradient: (#Color)- Second color of the gradient background, + the first one is given bybackground-color. Not inherited.- +
background-gradient-angle: (number)- Angle (in degrees, clockwise) of + the gradient. Not inherited. Initial value:90+
++ ++ ++ ++ ++ ++ ++ ++ 0 degrees + ++ 45 degrees + ++ 90 degrees + ++ 135 degrees + ++ 180 degrees + ++ Rounded corners
++ As you may already know, CSS is based on a + Box Model, where every box has it's own set of properties. Since we are + talking abound boxes, why not to make them with rounded corners, almost every + website you visit nowadays makes use of rounded corners, where a not very nice trick + with images and tables must be used.
++ In this renderer, the rounded corners are achieved by adding this CSS properties:
++
+ + Some examples +- +
corner-ne-radius: (length)Indicates the radius of the north-east corner. + Not ineritted- +
corner-se-radius: (length)Indicates the radius of the south-east corner. + Not ineritted- +
corner-sw-radius: (length)Indicates the radius of the south-west corner. + Not ineritted- +
corner-nw-radius: (length)Indicates the radius of the north-west corner. + Not ineritted- +
corner-radius: (length){1,4}Shorthand for the other corner properties. + Not ineritted+
++ ++ ++
++
++ c1 + ++ c2 + ++ c3 + ++ c4 + ++ c5 + +.c1, .c2, .c3, .c4, .c5 { background-color:olive; border:0px; color:white; vertical-align:middle; } +.c1 { corner-radius: 0px } +.c2 { corner-radius: 10px } +.c3 { corner-radius: 0px 10px 10px 0px } +.c4 { corner-radius: 18px } +.c5 { corner-radius: 10px; border: outset #bb0 2px; }+
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/09.Using the library.htm b/Source/Demo/Common/Samples/09.Using the library.htm new file mode 100644 index 000000000..d88839280 --- /dev/null +++ b/Source/Demo/Common/Samples/09.Using the library.htm @@ -0,0 +1,111 @@ + + + + + ++ Same as regular winforms tooltip but will render HTML and not just plain text. All HTML Renderer rules apply so you can use images, tables, styles, etc. +
+
+ Try the Sample Form and place the mouse over + the button to change the ToolTip of the button. +
+
++ Example tooltip, all Tooltips are wrapped in a div with the style of this paragraph ++ +Default tooltip style +
++.htmltooltip { + border:solid 1px #767676; + background-color:white; + background-gradient:#E4E5F0; + padding: 8px; + Font: 9pt Tahoma; +}+Examples +
++ The size, width and height, of the tooltip is auto sized by the html shown, the longest line will set the width of the tooltip.+
+
+
+ Note: this is not the case here because those examples are embedded in HtmlPanel, but you can use Sample Form to play with it. +
++ You can add any complex html as you require, including images, table bullets, etc. +++ Who said tooltip should be boring?
++
+ +- Not me!
+- Nope!
+
++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/10.HtmlPanel.htm b/Source/Demo/Common/Samples/10.HtmlPanel.htm new file mode 100644 index 000000000..12cc6d2de --- /dev/null +++ b/Source/Demo/Common/Samples/10.HtmlPanel.htm @@ -0,0 +1,142 @@ + + ++ The renderer follows the CSS Box Model. Box model is nothing but a tree of boxes, + just as the tree of HTML, each of this boxes is represented by a very used class + called CssBox. The start node is represented by the class HtmlContainer. +
++ All the known CSS properties apply to each of this boxes. Each box may contain any + number of child boxes and just one parent. The only box that has no parent at all + is the so called Html Container. +
++ The most common use +
++
+ HtmlPanel +
++ A panel that is ready to accept HTML code via its Text property.
+
++ The only properties you need to know are: AutoScroll. Activates/Deactivates the + auto-scroll capabilities as you know. It is set to true by default. Text. Gets/Sets + the HTML source. The panel will update the bounds of the elements as you scroll + or resize the control. +
++ HtmlLabel +
++ A label that is ready to accept HTML code via its Text property.
+
++ The only properties you need to know are: . AutoSize. Sets the size of the label + automatically if activated. Text. Gets/Sets the HTML source. +
++ HtmlToolTip +
++ Works exactly like the ToolTip you already know, with the little difference that + this tooltip will render HTML on it.
+
+ There are no properties here to learn. Use it just the way you use the ToolTip that + comes with the framework. Internally, it just handles the OwnerDraw event. ++ HtmlRender +
++ Use this static class to easily render small pieces of html directly using 'Graphics' + object.
+ For example it can be used to render html into an Image: ++// Measure the size of the html to know the image size +SizeF size; +using (var gImg = new Bitmap(1, 1)) +using (var g = Graphics.FromImage(gImg)) +{ + size = HtmlRender.Measure(g, html, 800); +} + +// Render the html into the output image +var img = new Bitmap((int)size.Width, (int)size.Height); +using (var g = Graphics.FromImage(img)) +{ + g.Clear(Color.White); + HtmlRender.Render(g, html, 0, 0, 800); +} + +img.Save(@"c:\html.png", ImageFormat.Png); ++ ++ HtmlContainer +
++ Low level handling of Html Renderer logic, this class is used by + HtmlPanel, HtmlLabel, + HtmlToolTip and HtmlRender.
+ The class allows html layout and rendering without association to actual winforms + control, thouse allowing to handle html rendering on any graphics object.
+ Using this class will require the client to handle all propogation of mouse\keyboard + events, layout/paint calls, scrolling offset and location/size/rectangle handling.
+ A simple use of an Html Container to draw HTML would look like this: ++// Create the Html Container +var c = new HtmlContainer(); + +// Set html to render +c.SetHtml("<div>hello <b>world</b></div>"); + +// Perform layout of the html +c.PerformLayout(graphics); + +// Paint the HTML +c.PerformPaint(graphics); ++ + +
HtmlRenderer.HtmlPanel
+ System.Windows.Forms.ScrollableControl
+ ++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/11.HtmlLabel.htm b/Source/Demo/Common/Samples/11.HtmlLabel.htm new file mode 100644 index 000000000..21de48813 --- /dev/null +++ b/Source/Demo/Common/Samples/11.HtmlLabel.htm @@ -0,0 +1,163 @@ + + ++ You can use it just as an HTML container control, just place the panel on a form + and feed the
+Textproperty with HTML code.
+ If AutoScroll is true and the layout of the html + resulted in its content beyond the client bounds of the panel it will show scrollbars + (horizontal/verticle) allowing to scroll the content.
+ If AutoScroll is false html content outside the + client bounds will be cliped.
+ The control will handle mouse and keyboard events on it to support html text selection, + copy-paste and mouse clicks.
+
+ Try the Sample Form to play with html panel control. ++ Properties +
++
+- +
++ IsSelectionEnabled - Is content selection is enabled for + the rendered html (default - true).
- +
++ IsContextMenuEnabled - Is the build-in context menu enabled + and will be shown on mouse right click (default - true).
- +
++ BaseStylesheet - Set base stylesheet to be used by html + rendered in the panel.
- +
++ AutoScroll - Gives the panel scroll bars when content + needs it.
- +
++ Text - Gets or sets the HTML source for rendering. +
+ Methods +
++
+- +
++ GetHtml() - Get html from the current DOM tree with inline + style.
+ Events +
++
+- +
++ LinkClicked - Raised when the user clicks on a link in + the html, Allows canceling the execution of the link.
- +
++ RenderError - Raised when an error occured during html + rendering.
- +
++ StylesheetLoad - Raised when aa stylesheet is about to + be loaded by file path or URI by link element. This event allows to provide the + stylesheet manually or provide new source (file or uri) to load from. +
- +
++ ImageLoad - Raised when an image is about to be loaded + by file path or URI. This event allows to provide the image manually, if not handled + the image will be loaded from file or download from URI.
+ Remarks +
++
+ Differences between HtmlPanel and HtmlLabel +
+ The major differential to use HtmlPanel or HtmlLabel is size and scrollbars.
+ If the size of the control depends on the html content the HtmlLabel should be used.
+ If the size is set by some kind of layout then HtmlPanel is more suitable, also + shows scrollbars if the html contents is larger than the control client rectangle.
++
+ +- HtmlPanel has scrollbars support
+- HtmlLabel can be autosized
+- HtmlLabel can have transparent background
++
+ AutoScroll +
+ Allows showing scrollbars if html content is placed outside the visible boundaries + of the panel. + ++
+ LinkClicked event +
+ Raised when the user clicks on a link in the html.
+ Allows canceling the execution of the link. + ++
+ StylesheetLoad event +
+ Raised when aa stylesheet is about to be loaded by file path or URI by link element.
+ This event allows to provide the stylesheet manually or provide new source (file + or uri) to load from.
+ If no alternative data is provided the original source will be used.
+ ++
+ ImageLoad event +
+ Raised when an image is about to be loaded by file path or URI.
+ This event allows to provide the image manually, if not handled the image will be + loaded from file or download from URI. + ++
+ RenderError event +
+ Raised when an error occured during html rendering.
+ +
HtmlRenderer.HtmlLabel
+ System.Windows.Forms.Control
+ ++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/12.HtmlToolTip.htm b/Source/Demo/Common/Samples/12.HtmlToolTip.htm new file mode 100644 index 000000000..97b201915 --- /dev/null +++ b/Source/Demo/Common/Samples/12.HtmlToolTip.htm @@ -0,0 +1,94 @@ + + ++ You can use it just as an HTML container control, just place the label on a form + and feed the
+Textproperty with HTML code.
+ Using AutoSize and AutoSizeHeightOnly + client can control how the html content effects the size of the label. Either case + scrollbars are never shown and html content outside of client bounds will be cliped + MaximumSize and MinimumSize + with AutoSize can limit the max/min size of the control.
+ The control will handle mouse and keyboard events on it to support html text selection, + copy-paste and mouse clicks.
+
+ Try the Sample Form to play with html label control. ++ Properties +
++
+- +
++ IsSelectionEnabled - Is content selection is enabled for + the rendered html (default - true).
- +
++ IsContextMenuEnabled - Is the build-in context menu enabled + and will be shown on mouse right click (default - true). +
- +
++ BaseStylesheet - Set base stylesheet to be used by html + rendered in the control.
- +
++ AutoSize - Automatically sets the size of the label by + content size
- +
++ AutoSizeHeightOnly - Automatically sets the height of + the label by content height (width is not effected).
- +
++ MaximumSize - Gets or sets the max size the control get + be set by AutoSize or AutoSizeHeightOnly.
- +
++ MinimumSize - Gets or sets the min size the control get + be set by AutoSize or AutoSizeHeightOnly.
- +
++ Text - Gets or sets the HTML source for rendering. +
+ Methods +
++
+- +
++ GetHtml() - Get html from the current DOM tree with inline + style.
+ Events +
++
+- +
++ LinkClicked - Raised when the user clicks on a link in + the html, Allows canceling the execution of the link.
- +
++ RenderError - Raised when an error occured during html + rendering.
- +
++ StylesheetLoad - Raised when aa stylesheet is about to + be loaded by file path or URI by link element. This event allows to provide the + stylesheet manually or provide new source (file or uri) to load from. +
- +
++ ImageLoad - Raised when an image is about to be loaded + by file path or URI. This event allows to provide the image manually, if not handled + the image will be loaded from file or download from URI.
+ Remarks +
++
+ Differences between HtmlPanel and HtmlLabel +
+ The major differential to use HtmlPanel or HtmlLabel is size and scrollbars.
+ If the size of the control depends on the html content the HtmlLabel should be used.
+ If the size is set by some kind of layout then HtmlPanel is more suitable, also + shows scrollbars if the html contents is larger than the control client rectangle.
++
+ +- HtmlPanel has scrollbars support
+- HtmlLabel can be autosized
+- HtmlLabel can have transparent background
++
+ AutoSize +
+ AutoSize = AutoSizeHeightOnly = false
+ The label size will not change by the html content. MaximumSize and MinimumSize + are ignored.
+ AutoSize = true
+ The width and height is adjustable by the html content, the width will be longest + line in the html, MaximumSize.Width will restrict it but it can be lower than that.
+ AutoSizeHeightOnly = true
+ The width of the label is set and will not change by the content, the height is + adjustable by the html content with restrictions to the MaximumSize.Height and MinimumSize.Height + values.
+ ++
+ LinkClicked event +
+ Raised when the user clicks on a link in the html.
+ Allows canceling the execution of the link. + ++
+ StylesheetLoad event +
+ Raised when aa stylesheet is about to be loaded by file path or URI by link element.
+ This event allows to provide the stylesheet manually or provide new source (file + or uri) to load from.
+ If no alternative data is provided the original source will be used.
+ ++
+ ImageLoad event +
+ Raised when an image is about to be loaded by file path or URI.
+ This event allows to provide the image manually, if not handled the image will be + loaded from file or download from URI. + ++
+ RenderError event +
+ Raised when an error occured during html rendering.
+ +
HtmlRenderer.HtmlToolTip
+ System.Windows.Forms.ToolTip
+ ++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/13.HtmlRender.htm b/Source/Demo/Common/Samples/13.HtmlRender.htm new file mode 100644 index 000000000..226e64357 --- /dev/null +++ b/Source/Demo/Common/Samples/13.HtmlRender.htm @@ -0,0 +1,69 @@ + + ++ Inherits directly from System.Windows.Forms.ToolTip, the only difference is that + the ToolTip text will be interpreted as HTML. All HTML Renderer Rules apply.
+
+ Try the Sample Form and place the mouse over + the button to change the ToolTip of the button. +Properties +
++
+- +
++ AllowLinksHandling - If to handle links in the tooltip When set to true the mouse pointer will change to hand when hovering over a tooltip and + if clicked the LinkClicked event will be raised although the tooltip will be closed.(default: false). + +
- +
++ BaseStylesheet - Set base stylesheet to be used by html rendered in the tooltip.
- +
++ MaximumSize - Gets or sets the max size of the tooltip.
Events +
++
+- +
++ LinkClicked - Raised when the user clicks on a link in + the html, Allows canceling the execution of the link.
- +
++ RenderError - Raised when an error occured during html + rendering.
- +
++ StylesheetLoad - Raised when aa stylesheet is about to + be loaded by file path or URI by link element. This event allows to provide the + stylesheet manually or provide new source (file or uri) to load from. +
- +
++ ImageLoad - Raised when an image is about to be loaded + by file path or URI. This event allows to provide the image manually, if not handled + the image will be loaded from file or download from URI.
Remarks +
++
Changing tooltip style +
+ You can change the style used for the tooltip by setting BaseStylesheet property with stylesheet data containing htmltooltip class. + ++
LinkClicked event +
+ Raised when the user clicks on a link in the html.
+ Allows canceling the execution of the link. + ++
StylesheetLoad event +
+ Raised when aa stylesheet is about to be loaded by file path or URI by link element.
+ This event allows to provide the stylesheet manually or provide new source (file + or uri) to load from.
+ If no alternative data is provided the original source will be used.
+ ++
ImageLoad event +
+ Raised when an image is about to be loaded by file path or URI.
+ This event allows to provide the image manually, if not handled the image will be + loaded from file or download from URI. + ++
RenderError event +
+ Raised when an error occured during html rendering.
+ +
HtmlRenderer.HtmlRender
+ ++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/14.HtmlContainer.htm b/Source/Demo/Common/Samples/14.HtmlContainer.htm new file mode 100644 index 000000000..cc25e14f2 --- /dev/null +++ b/Source/Demo/Common/Samples/14.HtmlContainer.htm @@ -0,0 +1,195 @@ + + ++
+Staticclass for direct html rendering, intendent for small html fragments.
+ Prefer using WinForms Html controls: HtmlPanel or HtmlLabel.
+ For direct non-trivial html rendering consider using HtmlContainer.
++ Not suitable for large htmls as each render call will parse the given html string into DOM structure, for large html it can be very expensive.
+
+ Consider using HtmlContainer for large html or for performance. ++++
Measure(Graphics g, string html, float maxWidth = 0, float maxHeight = 0, CssData cssData = null)+
++ // Measure the size (width and height) required to draw the given html under given width and height restrictions.+
++++
Measure(Graphics g, string html, float maxWidth, float maxHeight, CssData cssData, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad, EventHandler<HtmlImageLoadEventArgs> imageLoad)+
++ // Renders the specified HTML source on the specified location and max size restriction.+
+ // If maxWidth is zero the html will use all the required width, otherwise it will perform line wrap as specified in the html
+ // Returned is the actual widht and height of the rendered html.
++++
Render(Graphics g, string html, float left = 0, float top = 0, float maxWidth = 0, CssData cssData = null)+
++ // Renders the specified HTML source on the specified location and max size restriction.+
+ // If maxSize.Width is zero the html will use all the required width, otherwise it will perform line wrap as specified in the html
+ // If maxSize.Height is zero the html will use all the required height, otherwise it will clip at the given max height not rendering the html below it.
+ // Returned is the actual widht and height of the rendered html.
++++
Render(Graphics g, string html, PointF location, SizeF maxSize, CssData cssData = null)+
++ // Renders the specified HTML source on the specified location and max size restriction.+
+ // If maxSize.Width is zero the html will use all the required width, otherwise it will perform line wrap as specified in the html
+ // If maxSize.Height is zero the html will use all the required height, otherwise it will clip at the given max height not rendering the html below it.
+ // Returned is the actual widht and height of the rendered html.
++++
Render(Graphics g, string html, PointF location, SizeF maxSize, CssData cssData, EventHandler<HtmlStylesheetLoadEventArgs> stylesheetLoad, EventHandler<HtmlImageLoadEventArgs> imageLoad)+
HtmlRenderer.HtmlContainer
+ ++ + \ No newline at end of file diff --git a/Source/Demo/Common/Samples/20.About.htm b/Source/Demo/Common/Samples/20.About.htm new file mode 100644 index 000000000..e28d613b7 --- /dev/null +++ b/Source/Demo/Common/Samples/20.About.htm @@ -0,0 +1,45 @@ + + ++ Low level handling of Html Renderer logic, this class is used by + HtmlPanel, HtmlLabel, + HtmlToolTip and HtmlRender.
+ The class allows html layout and rendering without association to actual winforms + control, thouse allowing to handle html rendering on any graphics object.
+ Using this class will require the client to handle all propogation of mouse\keyboard + events, layout/paint calls, scrolling offset and location/size/rectangle handling + and UI refresh requests. ++ Properties +
++
+- +
++ CssData - the parsed stylesheet data used for handling + the html.
- +
++ AvoidGeometryAntialias - Gets or sets a value indicating + if antialiasing should be avoided for geometry like backgrounds and borders (default + - false).
- +
++ IsSelectionEnabled - Is content selection is enabled for + the rendered html (default - true).
- +
++ IsContextMenuEnabled - Is the build-in context menu enabled + and will be shown on mouse right click (default - true).
- +
++ ScrollOffset - The scroll offset of the html. +
- +
++ Location - the top-left most location of the rendered + html.
- +
++ MaxSize - the max width and height of the rendered html, + effects layout, actual size cannot exceed this values. Set zero for unlimited. +
- +
++ ActualSize - The actual size of the rendered html (after + layout).
+ Methods +
++
+- +
++ GetHtml(HtmlGenerationStyle styleGen = HtmlGenerationStyle.Inline) - Get html from the current DOM tree with style if requested. +
- +
++ PerformLayout(Graphics) - Measures the bounds of box and + children, recursively.
- +
++ PerformPaint(Graphics) - Render the html using the given + device.
- +
++ HandleMouseDown(Control, MouseEventArgs) - Handle mouse + down to handle selection.
- +
++ HandleMouseUp(Control, MouseEventArgs) - Handle mouse + up to handle selection and link click.
- +
++ HandleMouseDoubleClick(Control, MouseEventArgs) - Handle + mouse double click to select word under the mouse.
- +
++ HandleMouseMove(Control, MouseEventArgs) - Handle mouse + move to handle hover cursor and text selection.
- +
++ HandleMouseLeave(Control, MouseEventArgs) - Handle mouse + move to handle hover cursor.
- +
++ HandleKeyDown(parent, KeyEventArgs) - Handle key down + event for selection and copy.
+ Events +
++
+- +
++ LinkClicked - Raised when the user clicks on a link in + the html, Allows canceling the execution of the link.
- +
++ Refresh - Raised when html renderer requires refresh of + the control hosting (invalidation and re-layout).
- +
++ RenderError - Raised when an error occured during html + rendering.
- +
++ StylesheetLoad - Raised when aa stylesheet is about to + be loaded by file path or URI by link element. This event allows to provide the + stylesheet manually or provide new source (file or uri) to load from. +
- +
++ ImageLoad - Raised when an image is about to be loaded + by file path or URI. This event allows to provide the image manually, if not handled + the image will be loaded from file or download from URI.
+ Remarks +
++
+ MaxSize and ActualSize +
+ The max width and height of the rendered html.
+ The max width will effect the html layout wrapping lines, resize images and tables + where possible.
+ The max height does NOT effect layout, but will not render outside it (clip).
+ ActualSize can be exceed the max size by layout + restrictions (unwrappable line, set image size, etc.).
+ Set zero for unlimited (width\height separately).
+ ++
+ ScrollOffset +
+ This will adjust the rendered html by the given offset so the content will be "scrolled".
+ Element that is rendered at location (50,100) with offset of (0,200) will not be + rendered as it will be at -100 therefore outside the client rectangle of the control. + ++
+ LinkClicked event +
+ Raised when the user clicks on a link in the html.
+ Allows canceling the execution of the link. + ++
+ StylesheetLoad event +
+ Raised when aa stylesheet is about to be loaded by file path or URI by link element.
+ This event allows to provide the stylesheet manually or provide new source (file + or uri) to load from.
+ If no alternative data is provided the original source will be used.
+ ++
+ ImageLoad event +
+ Raised when an image is about to be loaded by file path or URI.
+ This event allows to provide the image manually, if not handled the image will be + loaded from file or download from URI. + ++
+ Refresh event +
+ Raised when html renderer requires refresh of the control hosting (invalidation + and re-layout).
+ There is no garantie that the event will be raised on the main thread, it can be + raised on threadpool thread. + ++
+ RenderError event +
+ Raised when an error occured during html rendering.
+ + +
++ + \ No newline at end of file diff --git a/Source/Demo/Common/SamplesLoader.cs b/Source/Demo/Common/SamplesLoader.cs new file mode 100644 index 000000000..7dcc219c4 --- /dev/null +++ b/Source/Demo/Common/SamplesLoader.cs @@ -0,0 +1,112 @@ +// "Therefore those skilled at the unorthodox +// are infinite as heaven and earth, +// inexhaustible as the great rivers. +// When they come to an end, +// they begin again, +// like the days and months; +// they die and are reborn, +// like the four seasons." +// +// - Sun Tsu, +// "The Art of War" + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; + +namespace TheArtOfDev.HtmlRenderer.Demo.Common +{ + public static class SamplesLoader + { + ///+ For updates and fixes go to HTML Renderer on + GitHub. +
++ For contributing go to ArthurHub/HTML-Renderer on + GitHub. +
++ Please submit bugs and requests to + HTML Renderer Issue Tracker on GitHub. +
+
+
+2012 - Arthur Teplitzki
++ https://TheArtOfDev.com ++2009 - Jose Manuel Menendez Poo
+
++ License
++++ The code is under the New BSD License (BSD) license. +
+
+ If you use the code on a commercial application, + please give the developers credit for the HTML Renderer code.
+
++ Thanks for the HTML highlighting code on the demo app to + Alun Evans
+
+