Upgrade minitest (to chibitest) and remove old tests.

This commit is contained in:
Frank Smit
2015-06-08 16:44:41 +02:00
parent cd23b30e5f
commit 9e5e28abeb
12 changed files with 295 additions and 575 deletions

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
import cffi

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
import sys
from inspect import getmembers

View File

@@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
from inspect import getmembers, ismethod
from ._hoedown import lib, ffi

0
tests/__init__.py Normal file
View File

211
tests/chibitest.py Normal file
View File

@@ -0,0 +1,211 @@
"""
chibitest
~~~~~~~~
chibitest is a really simple unit testing module. Less code is less bugs.
Inspired by Oktest, http://www.kuwata-lab.com/oktest/.
"""
import sys
import inspect
import traceback
from difflib import unified_diff
from collections import namedtuple
Result = namedtuple('Result', ('func', 'name', 'failure'))
def _exc_name(exception_class):
if not inspect.isclass(exception_class):
exception_class = exception_class.__class__
return '<{}.{}>'.format(
exception_class.__module__,
exception_class.__name__)
class ExtendedDict(dict):
def __getattr__(self, name):
if name in self:
return self[name]
else:
return None
def __setattr__(self, name, value):
self[name] = value
class AssertionObject(object):
def __init__(self, target):
self._target = target
def __lt__(self, other):
if not self._target < other:
raise AssertionError('{!r} < {!r}'.format(self._target, other))
def __le__(self, other):
if not self._target <= other:
raise AssertionError('{!r} <= {!r}'.format(self._target, other))
def __eq__(self, other):
if not self._target == other:
raise AssertionError('{!r} == {!r}'.format(self._target, other))
def __ne__(self, other):
if not self._target != other:
raise AssertionError('{!r} != {!r}'.format(self._target, other))
def __gt__(self, other):
if not self._target > other:
raise AssertionError('{!r} > {!r}'.format(self._target, other))
def __ge__(self, other):
if not self._target >= other:
raise AssertionError('{!r} >= {!r}'.format(self._target, other))
def length(self, other):
target_length = len(self._target)
if target_length > other:
raise AssertionError('Higher than desired length: {!r} > {!r}'
.format(target_length, other))
elif target_length < other:
raise AssertionError('Lower than desired length: {!r} < {!r}'
.format(target_length, other))
def diff(self, other):
if self._target != other:
difference = unified_diff(
other.splitlines(True),
self._target.splitlines(True))
raise AssertionError(''.join(difference))
def contains(self, other):
if other not in self._target:
raise AssertionError('{!r} in {!r}'.format(other, self._target))
def not_contains(self, other):
if other in self._target:
raise AssertionError('{!r} not in {!r}'.format(other, self._target))
def raises(self, exception_class=Exception):
name = _exc_name(exception_class)
# ``exception_class`` raised. Good!
# Anything other than ``exception_class`` raised. Wrong!
# No exception. Wrong!
try:
self._target()
except exception_class:
pass
except Exception as e:
raise AssertionError('Expected {}, but got {}:\n{}'
.format(name, _exc_name(e), e))
else:
raise AssertionError('{} not raised'.format(name))
def not_raises(self, exception_class=Exception):
name = _exc_name(exception_class)
# No exception raised. Good!
# ``exception_class`` raised. Wrong!
# Any exception raised. Wrong!
try:
self._target()
except exception_class as e:
raise AssertionError('{} raised:\n{}'.format(name, e))
except Exception as e:
raise AssertionError('Expected {} when failing, but got {}:\n{}'
.format(name, _exc_name(e), e))
def ok(target):
return AssertionObject(target)
class TestCase(object):
def __init__(self, config):
self.config = config
self._tests = []
for t in dir(self):
if t.startswith('test_'):
self._tests.append(self._wrap_test(getattr(self, t)))
def add_test(self, func):
self._tests.append(self._wrap_test(func))
def _wrap_test(self, func):
def catch_exception():
failure = None
try:
func()
except AssertionError as e:
failure = str(e)
except Exception as e:
failure = ''.join(traceback.format_exception(
*sys.exc_info())).strip()
doc = ''
if func.__doc__:
doc = func.__doc__.lstrip()
idx = doc.find('\n')
if idx > 0:
doc = doc[:idx]
return Result(func.__name__, doc or None, failure)
return catch_exception
def setup(self):
pass
def teardown(self):
pass
def run(self):
self.setup()
for test in self._tests:
yield test()
self.teardown()
def runner(testcases, setup_func=None, teardown_func=None, config={}):
line = '*' * 80
passed = failed = 0
config = ExtendedDict(config)
if setup_func:
setup_func()
for testcase in testcases:
tests = testcase(config)
print('>> {}'.format(tests.name if hasattr(tests, 'name')
else testcase.__name__))
for result in tests.run():
name = result.name or result.func
if result.failure is not None:
failed += 1
if result.failure:
print('{} ... FAILED\n{}\n{}\n{}'
.format(name, line, result.failure, line))
else:
print('{} ... FAILED'.format(name))
else:
passed += 1
print('{} ... PASSED'.format(name))
print()
if teardown_func:
teardown_func()
print('{} passed; {} failed.'.format(passed, failed))
if failed > 0:
sys.exit(1)

View File

@@ -1,149 +0,0 @@
"""
minitest
~~~~~~~~
minitest is a really simple unit testing module. Inspired by
Oktest, http://www.kuwata-lab.com/oktest/
"""
import sys
import time
import traceback
import contextlib
from difflib import unified_diff
from collections import namedtuple
Result = namedtuple('Result', ('func', 'name', 'failure'))
def msg(message):
return '{0}\n{1}\n{0}'.format('-' * 80, message)
class ExtendedDict(dict):
def __getattr__(self, name):
if name in self:
return self[name]
else:
return None
def __setattr__(self, name, value):
self[name] = value
class AssertionObject(object):
def __init__(self, target):
self._target = target
def __lt__(self, other):
if not self._target < other:
raise AssertionError(msg('%r < %r' % (self._target, other)))
def __le__(self, other):
if not self._target <= other:
raise AssertionError(msg('%r <= %r' % (self._target, other)))
def __eq__(self, other):
if not self._target == other:
raise AssertionError(msg('%r == %r' % (self._target, other)))
def __ne__(self, other):
if not self._target != other:
raise AssertionError(msg('%r != % ' % (self._target, other)))
def __gt__(self, other):
if not self._target > other:
raise AssertionError(msg('%r > %r' % (self._target, other)))
def __ge__(self, other):
if not self._target >= other:
raise AssertionError(msg('%r >= %r' % (self._target, other)))
def diff(self, other):
if self._target != other:
difference = unified_diff(
other.splitlines(True),
self._target.splitlines(True))
raise AssertionError(msg(''.join(difference)))
def contains(self, other):
if other not in self._target:
raise AssertionError(msg('%r in %r' % (other, self._target)))
def not_contains(self, other):
if other in self._target:
raise AssertionError(msg('%r not in %r' % (other, self._target)))
def ok(target):
return AssertionObject(target)
class TestCase(object):
def __init__(self, config):
self.config = config
self._tests = []
for t in dir(self):
if t.startswith('test_'):
self.add_test(getattr(self, t))
def add_test(self, func):
def catch_exception():
try:
func()
failure = None
except AssertionError as e:
failure = str(e)
except Exception as e:
failure = msg(''.join(
traceback.format_exception(*sys.exc_info())).strip())
return Result(func.__name__, func.__doc__, failure)
self._tests.append(catch_exception)
return catch_exception
def pre_setup(self):
pass
def setup(self):
pass
def teardown(self):
pass
def post_teardown(self):
pass
def run(self):
self.pre_setup()
self.setup()
for test in self._tests:
yield test()
self.teardown()
self.post_teardown()
def runner(testcases, config={}):
passed = failed = 0
config = ExtendedDict(config)
for testcase in testcases:
tests = testcase(config)
if hasattr(tests, 'name'):
print('\n>> %s' % tests.name)
for result in tests.run():
name = result.name or result.func
if result.failure is not None:
failed += 1
print('%s ... FAILED\n\n%s\n' % (name, result.failure))
else:
passed += 1
print('%s ... PASSED' % name)
print('\n\n%s passed; %s failed.' % (passed, failed))
if failed > 0:
sys.exit(1)

View File

@@ -1,345 +0,0 @@
# -*- coding: utf-8 -*-
# Most unit tests are based on the tests from Redcarpet.
import re
import codecs
from os import path
from glob import glob
from subprocess import Popen, PIPE, STDOUT
import misaka
from misaka import Markdown, BaseRenderer, HtmlRenderer, \
EXT_NO_INTRA_EMPHASIS, EXT_TABLES, EXT_FENCED_CODE, EXT_AUTOLINK, \
EXT_STRIKETHROUGH, EXT_SPACE_HEADERS, \
EXT_SUPERSCRIPT, \
HTML_SKIP_HTML, \
HTML_HARD_WRAP, \
HTML_USE_XHTML, HTML_ESCAPE
from minitest import TestCase, ok, runner
def clean_html(dirty_html):
input_html = dirty_html.encode('utf-8')
p = Popen(['tidy', '--show-body-only', '1', '--quiet', '1', '--show-warnings', '0', '-utf8'],
stdout=PIPE, stdin=PIPE, stderr=STDOUT)
stdout, stderr = p.communicate(input=input_html)
return stdout.decode('utf-8')
# class SmartyPantsTest(TestCase):
# name = 'SmartyPants'
# def setup(self):
# self.r = lambda html: misaka.html(html, render_flags=HTML_SMARTYPANTS)
# def test_single_quotes_re(self):
# html = self.r('<p>They\'re not for sale.</p>\n')
# ok(html).diff('<p>They&rsquo;re not for sale.</p>\n')
# def test_single_quotes_ll(self):
# html = self.r('<p>Well that\'ll be the day</p>\n')
# ok(html).diff('<p>Well that&rsquo;ll be the day</p>\n')
# def test_double_quotes_to_curly_quotes(self):
# html = self.r('<p>"Quoted text"</p>\n')
# ok(html).diff('<p>&ldquo;Quoted text&rdquo;</p>\n')
# def test_single_quotes_ve(self):
# html = self.r('<p>I\'ve been meaning to tell you ..</p>\n')
# ok(html).diff('<p>I&rsquo;ve been meaning to tell you ..</p>\n')
# def test_single_quotes_m(self):
# html = self.r('<p>I\'m not kidding</p>\n')
# ok(html).diff('<p>I&rsquo;m not kidding</p>\n')
# def test_single_quotes_d(self):
# html = self.r('<p>what\'d you say?</p>\n')
# ok(html).diff('<p>what&rsquo;d you say?</p>\n')
class HtmlRenderTest(TestCase):
name = 'Html Renderer'
def setup(self):
# pants = SmartyPants()
self.r = {
HTML_SKIP_HTML: HtmlRenderer(HTML_SKIP_HTML),
# HTML_SKIP_IMAGES: HtmlRenderer(HTML_SKIP_IMAGES),
# HTML_SKIP_LINKS: HtmlRenderer(HTML_SKIP_LINKS),
# HTML_SAFELINK: HtmlRenderer(HTML_SAFELINK),
HTML_ESCAPE: HtmlRenderer(HTML_ESCAPE),
HTML_HARD_WRAP: HtmlRenderer(HTML_HARD_WRAP)
}
def render_with(self, flag, text):
return Markdown(self.r[flag]).render(text)
# Hint: overrides HTML_SKIP_HTML, HTML_SKIP_IMAGES and HTML_SKIP_LINKS
def test_escape_html(self):
source = '''
Through <em>NO</em> <script>DOUBLE NO</script>
<script>BAD</script>
<img src="/favicon.ico" />
'''
expected = clean_html('''
<p>Through &lt;em&gt;NO&lt;/em&gt; &lt;script&gt;DOUBLE NO&lt;/script&gt;</p>
<p>&lt;script&gt;BAD&lt;/script&gt;</p>
<p>&lt;img src=&quot;/favicon.ico&quot; /&gt;</p>
''')
markdown = clean_html(self.render_with(HTML_ESCAPE, source))
ok(markdown).diff(expected)
def test_skip_html(self):
markdown = self.render_with(HTML_SKIP_HTML, 'Through <em>NO</em> <script>DOUBLE NO</script>')
ok(markdown).diff('<p>Through NO DOUBLE NO</p>\n')
def test_skip_html_two_space_hard_break(self):
markdown = self.render_with(HTML_SKIP_HTML, 'Lorem, \nipsum\n')
ok(markdown).diff('<p>Lorem,<br>\nipsum</p>\n')
# def test_skip_image(self):
# markdown = self.render_with(HTML_SKIP_IMAGES, '![dust mite](http://dust.mite/image.png) <img src="image.png" />')
# ok(markdown).not_contains('<img')
# def test_skip_links(self):
# markdown = self.render_with(HTML_SKIP_LINKS, '[This link](http://example.net/) <a href="links.html">links</a>')
# ok(markdown).not_contains('<a ')
# def test_safelink(self):
# markdown = self.render_with(HTML_SAFELINK, '[IRC](irc://chat.freenode.org/#freenode)')
# ok(markdown).diff('<p>[IRC](irc://chat.freenode.org/#freenode)</p>\n')
def test_hard_wrap(self):
markdown = self.render_with(HTML_HARD_WRAP, '''
Hello world,
this is just a simple test
With hard wraps
and other *things*.''')
ok(markdown).contains('<br>')
class MarkdownParserTest(TestCase):
name = 'Markdown Parser'
def setup(self):
self.r = Markdown(HtmlRenderer()).render
def render_with(self, text, flags=0, extensions=0):
return Markdown(HtmlRenderer(), extensions).render(text)
def test_one_liner_to_html(self):
markdown = self.r('Hello World.')
ok(markdown).diff('<p>Hello World.</p>\n')
def test_inline_markdown_to_html(self):
markdown = self.r('_Hello World_!')
ok(markdown).diff('<p><em>Hello World</em>!</p>\n')
def test_inline_markdown_start_end(self):
markdown = self.render_with('_start _ foo_bar bar_baz _ end_ *italic* **bold** <a>_blah_</a>',
extensions=EXT_NO_INTRA_EMPHASIS)
ok(markdown).diff('<p><em>start _ foo_bar bar_baz _ end</em> <em>italic</em> <strong>bold</strong> <a><em>blah</em></a></p>\n')
markdown = self.r('Run \'rake radiant:extensions:rbac_base:migrate\'')
ok(markdown).diff('<p>Run &#39;rake radiant:extensions:rbac_base:migrate&#39;</p>\n')
def test_urls_not_doubly_escaped(self):
markdown = self.r('[Page 2](/search?query=Markdown+Test&page=2)')
ok(markdown).diff('<p><a href="/search?query=Markdown+Test&amp;page=2">Page 2</a></p>\n')
def test_inline_html(self):
markdown = self.r('before\n\n<div>\n foo\n</div>\n\nafter')
ok(markdown).diff('<p>before</p>\n\n<div>\n foo\n</div>\n\n<p>after</p>\n')
def test_html_block_end_tag_on_same_line(self):
markdown = self.r('Para 1\n\n<div><pre>HTML block\n</pre></div>\n\nPara 2 [Link](#anchor)')
ok(markdown).diff('<p>Para 1</p>\n\n<div><pre>HTML block\n</pre></div>\n\n<p>Para 2 <a href=\"#anchor\">Link</a></p>\n')
# This isn't in the spec but is Markdown.pl behavior.
def test_block_quotes_preceded_by_spaces(self):
markdown = self.r(
'A wise man once said:\n\n' \
' > Isn\'t it wonderful just to be alive.\n')
ok(markdown).diff(
'<p>A wise man once said:</p>\n\n' \
'<blockquote>\n<p>Isn&#39;t it wonderful just to be alive.</p>\n</blockquote>\n')
# def test_html_block_not_wrapped_in_p(self):
# markdown = self.render_with(
# 'Things to watch out for\n\n' \
# '<ul>\n<li>Blah</li>\n</ul>\n',
# extensions=EXT_LAX_SPACING)
# ok(markdown).diff(
# '<p>Things to watch out for</p>\n\n' \
# '<ul>\n<li>Blah</li>\n</ul>\n')
# http://github.com/rtomayko/rdiscount/issues/#issue/13
def test_headings_with_trailing_space(self):
markdown = self.render_with(
'The Ant-Sugar Tales \n' \
'=================== \n\n' \
'By Candice Yellowflower \n')
ok(markdown).diff('<h1>The Ant-Sugar Tales </h1>\n\n<p>By Candice Yellowflower </p>\n')
def test_intra_emphasis(self):
markdown = self.r('foo_bar_baz')
ok(markdown).diff('<p>foo<em>bar</em>baz</p>\n')
markdown = self.render_with('foo_bar_baz', extensions=EXT_NO_INTRA_EMPHASIS)
ok(markdown).diff('<p>foo_bar_baz</p>\n')
def test_autolink(self):
markdown = self.render_with('http://axr.vg/', extensions=EXT_AUTOLINK)
ok(markdown).diff('<p><a href=\"http://axr.vg/\">http://axr.vg/</a></p>\n')
def test_tags_with_dashes_and_underscored(self):
markdown = self.r('foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b>')
ok(markdown).diff('<p>foo <asdf-qwerty>bar</asdf-qwerty> and <a_b>baz</a_b></p>\n')
def test_no_link_in_code_blocks(self):
markdown = self.r(' This is a code block\n This is a link [[1]] inside\n')
ok(markdown).diff('<pre><code>This is a code block\nThis is a link [[1]] inside\n</code></pre>\n')
def test_whitespace_after_urls(self):
markdown = self.render_with('Japan: http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm (yes, japan)',
extensions=EXT_AUTOLINK)
ok(markdown).diff('<p>Japan: <a href="http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm">http://www.abc.net.au/news/events/japan-quake-2011/beforeafter.htm</a> (yes, japan)</p>\n')
def test_infinite_loop_in_header(self):
markdown = self.render_with(
'######\n' \
'#Body#\n' \
'######\n')
ok(markdown).diff('<h1>Body</h1>\n')
def test_tables(self):
text = ' aaa | bbbb\n' \
'-----|------\n' \
'hello|sailor\n'
ok(self.render_with(text)).not_contains('<table')
ok(self.render_with(text, extensions=EXT_TABLES)).contains('<table')
def test_strikethrough(self):
text = 'this is ~some~ striked ~~text~~'
ok(self.render_with(text)).not_contains('<del')
ok(self.render_with(text, extensions=EXT_STRIKETHROUGH)).contains('<del')
def test_fenced_code_blocks(self):
text = '''
This is a simple test
~~~~~
This is some awesome code
with tabs and shit
~~~
'''
ok(self.render_with(text)).not_contains('<code')
ok(self.render_with(text, extensions=EXT_FENCED_CODE)).contains('<code')
# def test_fenced_code_blocks_without_space(self):
# text = 'foo\nbar\n```\nsome\ncode\n```\nbaz'
# ok(self.render_with(text)).not_contains('<pre><code>')
# ok(self.render_with(text, extensions=EXT_FENCED_CODE | EXT_LAX_SPACING)).contains('<pre><code>')
def test_linkable_headers(self):
markdown = self.r('### Hello [GitHub](http://github.com)')
ok(markdown).diff('<h3>Hello <a href=\"http://github.com\">GitHub</a></h3>\n')
def test_autolinking_with_ent_chars(self):
markdown = self.render_with('This a stupid link: https://github.com/rtomayko/tilt/issues?milestone=1&state=open',
extensions=EXT_AUTOLINK)
ok(markdown).diff('<p>This a stupid link: <a href=\"https://github.com/rtomayko/tilt/issues?milestone=1&amp;state=open\">https://github.com/rtomayko/tilt/issues?milestone=1&amp;state=open</a></p>\n')
def test_spaced_headers(self):
text = '#123 a header yes\n'
ok(self.render_with(text, extensions=EXT_SPACE_HEADERS)).not_contains('<h1>')
class MarkdownConformanceTest_10(TestCase):
name = 'Markdown Conformance 1.0'
suite = 'MarkdownTest_1.0'
def setup(self):
self.r = Markdown(HtmlRenderer()).render
tests_dir = path.dirname(__file__)
for text_path in glob(path.join(tests_dir, self.suite, '*.text')):
html_path = '%s.html' % path.splitext(text_path)[0]
self._create_test(text_path, html_path)
def _create_test(self, text_path, html_path):
def test():
with codecs.open(text_path, 'r', encoding='utf-8') as fd:
text = fd.read()
with codecs.open(html_path, 'r', encoding='utf-8') as fd:
expected_html = fd.read()
actual_html = self.r(text)
expected_result = clean_html(expected_html)
actual_result = clean_html(actual_html)
ok(actual_result).diff(expected_result)
test.__name__ = self._test_name(text_path)
self.add_test(test)
def _test_name(self, text_path):
name = path.splitext(path.basename(text_path))[0]
name = name.replace(' - ', '_')
name = name.replace(' ', '_')
name = re.sub('[(),]', '', name)
return 'test_%s' % name.lower()
class MarkdownConformanceTest_103(MarkdownConformanceTest_10):
name = 'Markdown Conformance 1.0.3'
suite = 'MarkdownTest_1.0.3'
class UnicodeTest(TestCase):
name = 'Unicode'
def setup(self):
self.r = Markdown(HtmlRenderer()).render
def test_unicode(self):
tests_dir = path.dirname(__file__)
with codecs.open(path.join(tests_dir, 'unicode.txt'), 'r', encoding='utf-8') as fd:
text = fd.read()
with codecs.open(path.join(tests_dir, 'unicode.html'), 'r', encoding='utf-8') as fd:
html = fd.read()
markdown = self.r(text)
ok(markdown).diff(html)
def run_tests():
runner([
# SmartyPantsTest,
HtmlRenderTest,
MarkdownParserTest,
MarkdownConformanceTest_10,
MarkdownConformanceTest_103,
UnicodeTest
])
if __name__ == '__main__':
run_tests()

15
tests/runner.py Normal file
View File

@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from chibitest import runner
from test_markdown import MarkdownConformanceTest_10, MarkdownConformanceTest_103
def run_tests():
runner([
MarkdownConformanceTest_10,
MarkdownConformanceTest_103,
])
if __name__ == '__main__':
run_tests()

51
tests/test_markdown.py Normal file
View File

@@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
import re
import codecs
from os import path
from glob import glob
from chibitest import TestCase, ok
from misaka import Markdown, HtmlRenderer
from test_utils import clean_html
class MarkdownConformanceTest_10(TestCase):
name = 'Markdown Conformance 1.0'
suite = 'MarkdownTest_1.0'
def setup(self):
self.r = Markdown(HtmlRenderer()).render
tests_dir = path.dirname(__file__)
for text_path in glob(path.join(tests_dir, self.suite, '*.text')):
html_path = '%s.html' % path.splitext(text_path)[0]
self._create_test(text_path, html_path)
def _create_test(self, text_path, html_path):
def test():
with codecs.open(text_path, 'r', encoding='utf-8') as fd:
text = fd.read()
with codecs.open(html_path, 'r', encoding='utf-8') as fd:
expected_html = fd.read()
actual_html = self.r(text)
expected_result = clean_html(expected_html)
actual_result = clean_html(actual_html)
ok(actual_result).diff(expected_result)
test.__name__ = self._test_name(text_path)
self.add_test(test)
def _test_name(self, text_path):
name = path.splitext(path.basename(text_path))[0]
name = name.replace(' - ', '_')
name = name.replace(' ', '_')
name = re.sub('[(),]', '', name)
return 'test_{}'.format(name.lower())
class MarkdownConformanceTest_103(MarkdownConformanceTest_10):
name = 'Markdown Conformance 1.0.3'
suite = 'MarkdownTest_1.0.3'

12
tests/test_utils.py Normal file
View File

@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE, STDOUT
def clean_html(dirty_html):
input_html = dirty_html.encode('utf-8')
p = Popen(['tidy', '--show-body-only', '1', '--quiet', '1', '--show-warnings', '0', '-utf8'],
stdout=PIPE, stdin=PIPE, stderr=STDOUT)
stdout, stderr = p.communicate(input=input_html)
return stdout.decode('utf-8')

View File

@@ -1,40 +0,0 @@
<p><strong>Ṳᾔ☤ḉ◎ḓ℮</strong> ḯṧ α ¢◎м℘ü⊥☤ᾔ❡ ☤η∂υ﹩тяƴ ṧ☂αη∂@ґḓ ḟ☺я ☂н℮ ¢øᾔṧї﹩⊥ℯηт ℮η¢☺∂☤ηℊ, яℯρяℯ﹩εᾔ⊥αтḯ☺η
αᾔⅾ ℌ@ᾔ∂ʟїηℊ ◎ƒ ☂ℯϰ☂ ε✖ρґ℮ṧṧε∂ ḯᾔ ღ◎﹩☂ øḟ тℌℯ ω◎ґℓ∂‷﹩ ωґї☂їᾔℊ ﹩¥﹩⊥ℯмṧ▪ Ð℮♥εʟ☺ρεⅾ
їη ḉ◎ᾔʝüη¢тї◎η ẘї☂♄ ⊥нℯ Ṳη☤ṽεяṧαℓ ℃ℌ@ґ@¢⊥℮ґ ϟ℮☂ ṧтαηⅾαґⅾ αη∂ ℘ʊßłїṧℌℯⅾ ☤η ♭◎øк
ḟ◎ґм αṧ †н℮ Üηї¢øḓ℮ ϟ☂@ᾔ∂αяⅾ, т♄ε łα☂℮﹩⊥ ṽεяṧ☤☺η ◎ḟ Üηї¢øḓℯ ¢øηṧḯ﹩т﹩ ◎ƒ @ я℮ρεґ⊥◎ḯґ℮
◎ḟ м◎ґε тн@η 110,000 ¢♄αґ@ḉ☂εґṧ ¢☺♥εґ☤ᾔ 100 ṧḉґї℘тṧ, α ṧεт øḟ ¢◎∂ℯ ¢ℌαґтṧ ḟ◎я
√ї﹩ʊαℓ ґεƒ℮ґ℮ηḉ℮, αᾔ ℯη¢øⅾḯᾔℊ με⊥ℌ◎ḓøłø❡¥ αη∂ ṧℯ☂ ◎ḟ ṧ⊥@ηⅾ@яⅾ ḉ♄@ґ@ḉт℮я ℯᾔ¢øⅾḯη❡ṧ,
αη ℮ηυღεґα⊥ḯ☺η øḟ ¢♄αя@¢⊥εґ ρґ◎ρ℮ґ☂ї℮﹩ ṧʊḉ♄ αṧ ʊ℘ρℯґ αηḓ ℓøẘ℮ґ ¢αṧ℮, @ ṧε☂ ☺ƒ
яεḟεґℯηḉ℮ ḓ@⊥@ ¢øμρυ☂ℯя ƒїℓ℮﹩, αηḓ @ ηυм♭εґ ☺ƒ ґℯłαт℮∂ ї☂εღṧ, ṧü¢ℌ αṧ ḉℌαґα¢тεя
℘ґ◎℘℮я☂їℯṧ, ґʊł℮ṧ ḟ☺я η☺ґмαʟḯℨαтḯøᾔ, ḓε¢☺μ℘◎ṧḯ☂ḯ☺ᾔ, ḉ◎ℓʟ@тḯ◎η, яεηⅾεя☤η❡, @ᾔⅾ
ß☤ḓ☤ґ℮¢☂ḯ☺ᾔαʟ ḓї﹩ρℓαƴ ◎яḓ℮я (ƒ◎я ☂ℌℯ ḉ◎ґґε¢☂ ∂☤﹩℘łα¥ øƒ ⊥ℯ✖⊥ ¢◎ᾔт@☤ηḯᾔℊ ß◎⊥♄
ґїℊℌ⊥➸☂◎➸ł℮ḟ☂ ﹩¢ґ☤℘☂ṧ, ﹩ü¢н @ṧ Ѧґα♭ḯ¢ αηḓ Ħℯ♭я℮ẘ, αηḓ łℯḟ⊥✏⊥◎➸я☤ℊн☂ ṧḉґḯ℘☂ṧ)▪[1]
Ѧṧ ◎ƒ 2012, ⊥♄ε ღ☺ṧ☂ я℮¢ℯη⊥ ṽεя﹩ḯ☺η ☤ṧ Ṳηḯ¢◎ḓ 6▪1▣</p>
<p>Üᾔḯḉ☺ⅾ℮❝﹩ ṧʊ¢ḉℯ﹩ṧ @☂ üηḯḟƴїᾔℊ ¢нαя@ḉтεя ﹩ℯтṧ н@ṧ ℓℯḓ ☂ø ḯ⊥ṧ ẘ☤∂ε﹩℘ґ℮αḓ αη∂ ρґεḓøмḯᾔ@ηт
υṧℯ ḯᾔ ⊥нℯ ☤ηтℯяᾔ@⊥ḯ◎ηαʟ☤ẕ@☂ї◎ᾔ αᾔḓ ʟ☺ḉαʟ☤ℨαт☤øη ☺ƒ ¢◎ღ℘ʊтℯґ ﹩◎ḟтẘαґε▪ ✝ℌℯ ﹩т@η∂αґⅾ
♄@ṧ ♭ε℮η ☤ღ℘łεμεη☂ℯⅾ ☤ᾔ μαη⑂ я℮¢εη⊥ тε¢нᾔ☺ℓ☺❡їε﹩, ḯᾔ¢ʟυⅾїη❡ 卐ℳℒ, ⊥ℌε Jαα ρґ◎ґαμμ☤ᾔ
ℓαᾔℊüαℊε, ⊥нℯ ♏ḯ¢ґ☺ṧ☺ḟ⊥ ▪ℵℰ✝ ℉ґαღℯẘ☺як, αᾔḓ м◎∂ℯґη ☺ρεґ@☂їᾔℊ ṧ¥﹩тεღ﹩▣</p>
<p>Ṳᾔḯ¢☺ḓε ¢αη ♭ε їмρℓεμ℮ᾔтℯ∂ ßƴ ḓḯḟḟ℮яℯη☂ ¢нαґ@ḉ⊥ℯґ ℮η¢øⅾ☤η❡﹩▣ ✝♄℮ ღ◎ṧ☂ ¢☺ღღ◎ηʟƴ ʊṧε∂
℮η¢øḓїη❡ṧ αґε <em>Ü✞➸8</em>, <em>Ü✞✏16</em> αηⅾ т♄ℯ ηøẘ➸☺♭ṧ◎ʟℯ☂℮ Üϟ➸2▣ Ṳ✞➸8 ʊṧε﹩ ☺ηℯ ♭¥⊥ε ƒ◎ґ
@ηƴ ѦϟℭЇℐ ¢ℌ@ґ@ḉ⊥ℯґ﹩, ẘнї¢♄ н@♥ε тℌ℮ ṧαμ℮ ¢☺ḓ℮ √αłü℮﹩ ☤η ♭☺т♄ Ṳ†℉➸8 @ηḓ Ѧ$
℮ᾔ¢ø∂☤η❡, αᾔḓ ü℘ ☂☺ ƒøʊґ ♭⑂тεṧ ḟ◎ґ ø☂нεя ¢нαґα¢⊥яṧ▣ Ṳ℃ϟ➸2 ʊ﹩ℯṧ ☂ω◎ ♭¥☂ℯṧ ḟøґ
@ḉ♄ ḉℌαґα¢тℯґ ♭ʊт ḉ@ηηø☂ ℯᾔ¢◎ḓ℮ ℮♥ℯґ⑂ ḉℌαя@¢⊥ℯґ ☤ᾔ тнℯ ḉüґяεηт Ṳη☤ḉøḓε ṧ⊥@ηḓαяⅾ▪
Ṳ†℉➸16 ϰтεᾔ∂ṧ Ṳ℃ϟ➸2, üṧ☤ηℊ ḟ☺ʊґ ♭⑂⊥ε﹩ ⊥◎ ℌαηⅾʟ℮ ℯαḉн ◎ƒ т♄℮ αḓḓḯ☂☤◎η@ʟ ¢ℌαяα¢☂℮яṧ▣</p>
<p>Unicode統一碼、萬國碼、單一碼、標準萬國碼是電腦科學領域裡的一項業界標準。它為世界上大部分的文字系統進行整理、編碼使得電腦可以用更為簡化地方式來呈現和處理文字。</p>
<p>統一碼依隨著通用字符集Universal Character Set的標準而發展同時也以書本的形式[1]對外發表。Unicode至今仍在不斷增修每個新版本都加入更多新的字符。目前最新的版本為第六版已納入超過十萬個字符第十萬個字符在2005年獲採納。統一碼涵蓋的資料除了視覺上的字形、編碼方法、標準的字符編碼外還包含了字符特性如大小寫字母。</p>
<p>Unicode發展是由非營利機構統一碼聯盟所負責其致力於讓Unicode方案取代既有的字符編碼方案。因為既有的方案往往僅有有限的空間亦不適用於多語環境。</p>
<p>Unicode備受认可並廣泛地應用於電腦軟體的國際化與本地化過程。有很多新科技如可扩展置标语言、Java程式語言以及現代的作業系統都採用Unicode編碼。</p>
<p>من ويكيبيديا، الموسوعة الحرة</p>
<p>في علم الحاسوب، الترميز الموحد أو الشفرة الموحدة (يونيكود[1] أو يُونِكُود[2]) معيار يمكن الحواسيب من تمثيل النصوص المكتوبة بأغلب نظم الكتابة ومعالجتها، بصورة متناسقة. يتكون يونيكود من 100،000 محرف، وطقم من مخططات الرموز كمرجع مرئي، ونهج في الترميز، وطقم من ترميزات المحارف المعيارية، وسرد لخصائص المحارف، وطقم من البيانات المرجعية، وعدد من الأمور المتعلقة مثل خصائص المحارف، وقواعد تطبيع النص، وفك الحروف لوحداتها الأولية، والترتيب، والتصيير، وثنائية الاتجاه (لعرض النصوص الذي يحتوي على كتابات من اليمين لليسار، مثل العربية، مع كتابات من اليسار لليمين، مثل اللاتينية).[3] يطور يونيكود بالتوازي مع معيار طقم المحارف العالمي، وينشر على شكل كتاب يحمل الاسم معيار يونيكود (Unicode Standard).</p>
<p>يطمح مجمع يونيكود -المنظمة غير الربحية التي تنسق تطوير يونيكود- في النهاية إلى استبدال ترميزات المحارف الموجودة حاليا، ليحل محلها يونيكود وتنسيق يونيكود المعياري للتحويل (Unicode Transformation Format ،UTF)، حيث أن الكثير من الترميزات الحالية محدودة السعة والمدى ولا تتوافق مع البيئات متعددة اللغات.</p>
<p>أدى نجاح يونيكود في توحيد أطقم المحارف إلى انتشار وغلبة استخدامه في توطين وعولمة برمجيات الحاسوب. وجرى تطبيق البرنامج في العديد من التقنيات الحديثة، مثل XML، ولغة البرمجة جافا وأنظمة التشغيل الحديثة.</p>

View File

@@ -1,41 +0,0 @@
**Ṳᾔ☤ḉ◎ḓ℮** ḯṧ α ¢◎м℘ü⊥☤ᾔ❡ ☤η∂υ﹩тяƴ ṧ☂αη∂@ґḓ ḟ☺я ☂н℮ ¢øᾔṧї﹩⊥ℯηт ℮η¢☺∂☤ηℊ, яℯρяℯ﹩εᾔ⊥αтḯ☺η
αᾔⅾ ℌ@ᾔ∂ʟїηℊ ◎ƒ ☂ℯϰ☂ ε✖ρґ℮ṧṧε∂ ḯᾔ ღ◎﹩☂ øḟ тℌℯ ω◎ґℓ∂‷﹩ ωґї☂їᾔℊ ﹩¥﹩⊥ℯмṧ▪ Ð℮♥εʟ☺ρεⅾ
їη ḉ◎ᾔʝüη¢тї◎η ẘї☂♄ ⊥нℯ Ṳη☤ṽεяṧαℓ ℃ℌ@ґ@¢⊥℮ґ ϟ℮☂ ṧтαηⅾαґⅾ αη∂ ℘ʊßłїṧℌℯⅾ ☤η ♭◎øк
ḟ◎ґм αṧ †н℮ Üηї¢øḓ℮ ϟ☂@ᾔ∂αяⅾ, т♄ε łα☂℮﹩⊥ ṽεяṧ☤☺η ◎ḟ Üηї¢øḓℯ ¢øηṧḯ﹩т﹩ ◎ƒ @ я℮ρεґ⊥◎ḯґ℮
◎ḟ м◎ґε тн@η 110,000 ¢♄αґ@ḉ☂εґṧ ¢☺♥εґ☤ᾔ 100 ṧḉґї℘тṧ, α ṧεт øḟ ¢◎∂ℯ ¢ℌαґтṧ ḟ◎я
√ї﹩ʊαℓ ґεƒ℮ґ℮ηḉ℮, αᾔ ℯη¢øⅾḯᾔℊ με⊥ℌ◎ḓøłø❡¥ αη∂ ṧℯ☂ ◎ḟ ṧ⊥@ηⅾ@яⅾ ḉ♄@ґ@ḉт℮я ℯᾔ¢øⅾḯη❡ṧ,
αη ℮ηυღεґα⊥ḯ☺η øḟ ¢♄αя@¢⊥εґ ρґ◎ρ℮ґ☂ї℮﹩ ṧʊḉ♄ αṧ ʊ℘ρℯґ αηḓ ℓøẘ℮ґ ¢αṧ℮, @ ṧε☂ ☺ƒ
яεḟεґℯηḉ℮ ḓ@⊥@ ¢øμρυ☂ℯя ƒїℓ℮﹩, αηḓ @ ηυм♭εґ ☺ƒ ґℯłαт℮∂ ї☂εღṧ, ṧü¢ℌ αṧ ḉℌαґα¢тεя
℘ґ◎℘℮я☂їℯṧ, ґʊł℮ṧ ḟ☺я η☺ґмαʟḯℨαтḯøᾔ, ḓε¢☺μ℘◎ṧḯ☂ḯ☺ᾔ, ḉ◎ℓʟ@тḯ◎η, яεηⅾεя☤η❡, @ᾔⅾ
ß☤ḓ☤ґ℮¢☂ḯ☺ᾔαʟ ḓї﹩ρℓαƴ ◎яḓ℮я (ƒ◎я ☂ℌℯ ḉ◎ґґε¢☂ ∂☤﹩℘łα¥ øƒ ⊥ℯ✖⊥ ¢◎ᾔт@☤ηḯᾔℊ ß◎⊥♄
ґїℊℌ⊥➸☂◎➸ł℮ḟ☂ ﹩¢ґ☤℘☂ṧ, ﹩ü¢н @ṧ Ѧґα♭ḯ¢ αηḓ Ħℯ♭я℮ẘ, αηḓ łℯḟ⊥✏⊥◎➸я☤ℊн☂ ṧḉґḯ℘☂ṧ)▪[1]
Ѧṧ ◎ƒ 2012, ⊥♄ε ღ☺ṧ☂ я℮¢ℯη⊥ ṽεя﹩ḯ☺η ☤ṧ Ṳηḯ¢◎ḓ 6▪1▣
Üᾔḯḉ☺ⅾ℮❝﹩ ṧʊ¢ḉℯ﹩ṧ @☂ üηḯḟƴїᾔℊ ¢нαя@ḉтεя ﹩ℯтṧ н@ṧ ℓℯḓ ☂ø ḯ⊥ṧ ẘ☤∂ε﹩℘ґ℮αḓ αη∂ ρґεḓøмḯᾔ@ηт
υṧℯ ḯᾔ ⊥нℯ ☤ηтℯяᾔ@⊥ḯ◎ηαʟ☤ẕ@☂ї◎ᾔ αᾔḓ ʟ☺ḉαʟ☤ℨαт☤øη ☺ƒ ¢◎ღ℘ʊтℯґ ﹩◎ḟтẘαґε▪ ✝ℌℯ ﹩т@η∂αґⅾ
♄@ṧ ♭ε℮η ☤ღ℘łεμεη☂ℯⅾ ☤ᾔ μαη⑂ я℮¢εη⊥ тε¢нᾔ☺ℓ☺❡їε﹩, ḯᾔ¢ʟυⅾїη❡ 卐ℳℒ, ⊥ℌε Jαα ρґ◎ґαμμ☤ᾔ
ℓαᾔℊüαℊε, ⊥нℯ ♏ḯ¢ґ☺ṧ☺ḟ⊥ ▪ℵℰ✝ ℉ґαღℯẘ☺як, αᾔḓ м◎∂ℯґη ☺ρεґ@☂їᾔℊ ṧ¥﹩тεღ﹩▣
Ṳᾔḯ¢☺ḓε ¢αη ♭ε їмρℓεμ℮ᾔтℯ∂ ßƴ ḓḯḟḟ℮яℯη☂ ¢нαґ@ḉ⊥ℯґ ℮η¢øⅾ☤η❡﹩▣ ✝♄℮ ღ◎ṧ☂ ¢☺ღღ◎ηʟƴ ʊṧε∂
℮η¢øḓїη❡ṧ αґε _Ü✞➸8_, _Ü✞✏16_ αηⅾ т♄ℯ ηøẘ➸☺♭ṧ◎ʟℯ☂℮ Üϟ➸2▣ Ṳ✞➸8 ʊṧε﹩ ☺ηℯ ♭¥⊥ε ƒ◎ґ
@ηƴ ѦϟℭЇℐ ¢ℌ@ґ@ḉ⊥ℯґ﹩, ẘнї¢♄ н@♥ε тℌ℮ ṧαμ℮ ¢☺ḓ℮ √αłü℮﹩ ☤η ♭☺т♄ Ṳ†℉➸8 @ηḓ Ѧ$
℮ᾔ¢ø∂☤η❡, αᾔḓ ü℘ ☂☺ ƒøʊґ ♭⑂тεṧ ḟ◎ґ ø☂нεя ¢нαґα¢⊥яṧ▣ Ṳ℃ϟ➸2 ʊ﹩ℯṧ ☂ω◎ ♭¥☂ℯṧ ḟøґ
@ḉ♄ ḉℌαґα¢тℯґ ♭ʊт ḉ@ηηø☂ ℯᾔ¢◎ḓ℮ ℮♥ℯґ⑂ ḉℌαя@¢⊥ℯґ ☤ᾔ тнℯ ḉüґяεηт Ṳη☤ḉøḓε ṧ⊥@ηḓαяⅾ▪
Ṳ†℉➸16 ϰтεᾔ∂ṧ Ṳ℃ϟ➸2, üṧ☤ηℊ ḟ☺ʊґ ♭⑂⊥ε﹩ ⊥◎ ℌαηⅾʟ℮ ℯαḉн ◎ƒ т♄℮ αḓḓḯ☂☤◎η@ʟ ¢ℌαяα¢☂℮яṧ▣
Unicode統一碼、萬國碼、單一碼、標準萬國碼是電腦科學領域裡的一項業界標準。它為世界上大部分的文字系統進行整理、編碼使得電腦可以用更為簡化地方式來呈現和處理文字。
統一碼依隨著通用字符集Universal Character Set的標準而發展同時也以書本的形式[1]對外發表。Unicode至今仍在不斷增修每個新版本都加入更多新的字符。目前最新的版本為第六版已納入超過十萬個字符第十萬個字符在2005年獲採納。統一碼涵蓋的資料除了視覺上的字形、編碼方法、標準的字符編碼外還包含了字符特性如大小寫字母。
Unicode發展是由非營利機構統一碼聯盟所負責其致力於讓Unicode方案取代既有的字符編碼方案。因為既有的方案往往僅有有限的空間亦不適用於多語環境。
Unicode備受认可並廣泛地應用於電腦軟體的國際化與本地化過程。有很多新科技如可扩展置标语言、Java程式語言以及現代的作業系統都採用Unicode編碼。
من ويكيبيديا، الموسوعة الحرة
في علم الحاسوب، الترميز الموحد أو الشفرة الموحدة (يونيكود[1] أو يُونِكُود[2]) معيار يمكن الحواسيب من تمثيل النصوص المكتوبة بأغلب نظم الكتابة ومعالجتها، بصورة متناسقة. يتكون يونيكود من 100،000 محرف، وطقم من مخططات الرموز كمرجع مرئي، ونهج في الترميز، وطقم من ترميزات المحارف المعيارية، وسرد لخصائص المحارف، وطقم من البيانات المرجعية، وعدد من الأمور المتعلقة مثل خصائص المحارف، وقواعد تطبيع النص، وفك الحروف لوحداتها الأولية، والترتيب، والتصيير، وثنائية الاتجاه (لعرض النصوص الذي يحتوي على كتابات من اليمين لليسار، مثل العربية، مع كتابات من اليسار لليمين، مثل اللاتينية).[3] يطور يونيكود بالتوازي مع معيار طقم المحارف العالمي، وينشر على شكل كتاب يحمل الاسم معيار يونيكود (Unicode Standard).
يطمح مجمع يونيكود -المنظمة غير الربحية التي تنسق تطوير يونيكود- في النهاية إلى استبدال ترميزات المحارف الموجودة حاليا، ليحل محلها يونيكود وتنسيق يونيكود المعياري للتحويل (Unicode Transformation Format ،UTF)، حيث أن الكثير من الترميزات الحالية محدودة السعة والمدى ولا تتوافق مع البيئات متعددة اللغات.
أدى نجاح يونيكود في توحيد أطقم المحارف إلى انتشار وغلبة استخدامه في توطين وعولمة برمجيات الحاسوب. وجرى تطبيق البرنامج في العديد من التقنيات الحديثة، مثل XML، ولغة البرمجة جافا وأنظمة التشغيل الحديثة.