From: Jan Szejko Date: Mon, 7 Mar 2016 12:41:58 +0000 (+0100) Subject: local changes from server X-Git-Url: https://git.mdrn.pl/librarian.git/commitdiff_plain/3f64488684dbf14b7e0005209d2dca878e1852d9?hp=85b5bd4d4b6fdaff30df0dce136db850fe610830 local changes from server --- diff --git a/a.py b/a.py new file mode 100644 index 0000000..d5f4886 --- /dev/null +++ b/a.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +from librarian.document import Document as SST +from librarian.formats.pdf import PdfFormat +from librarian.utils import Context +import shutil + +sst = SST.from_file('milpdf/a.xml') +of = PdfFormat(sst).build(Context(), verbose=True) +shutil.copy(of.get_filename(), 'a.pdf') + + + diff --git a/librarian/document.py b/librarian/document.py index 32148e3..acc80ae 100755 --- a/librarian/document.py +++ b/librarian/document.py @@ -21,11 +21,22 @@ class Document(object): if not isinstance(root_elem, Section): if root_elem.tag != SSTNS('section'): - raise ValidationError("Invalid root element. Found '%s', should be '%s'" % ( - root_elem.tag, SSTNS('section'))) + if root_elem.tag == 'section': + for element in root_elem.iter(): + if element.tag in ('section', 'header', 'div', 'span', 'aside', 'metadata'): + element.tag = str(SSTNS(element.tag)) + + parser = SSTParser() + tree = etree.parse(StringIO(etree.tostring(root_elem)), parser) + tree.xinclude() + self.edoc = tree + else: + raise ValueError("Invalid root element. Found '%s', should be '%s'" % ( + root_elem.tag, SSTNS('section'))) else: - raise ValidationError("Invalid class of root element. " + raise ValueError("Invalid class of root element. " "Use librarian.parser.SSTParser.") + #print etree.tostring(self.edoc.getroot()) @classmethod def from_string(cls, xml, *args, **kwargs): @@ -47,6 +58,8 @@ class Document(object): data = data.decode('utf-8') data = data.replace(u'\ufeff', '') + # This is bad. The editor shouldn't spew unknown HTML entities. + data = data.replace(u' ', u'\u00a0') parser = SSTParser() tree = etree.parse(StringIO(data.encode('utf-8')), parser) diff --git a/librarian/formats/html/__init__.py b/librarian/formats/html/__init__.py index ddf2c78..2cf2601 100644 --- a/librarian/formats/html/__init__.py +++ b/librarian/formats/html/__init__.py @@ -22,7 +22,7 @@ class HtmlFormat(Format): super(HtmlFormat, self).__init__(doc) self.standalone = standalone - def build(self): + def build(self, files_path=None): if self.standalone: tmpl = get_resource("formats/html/res/html_standalone.html") else: @@ -30,6 +30,7 @@ class HtmlFormat(Format): t = etree.parse(tmpl) ctx = Context(format=self) + ctx.files_path = files_path ctx.toc = TOC() ctx.toc_level = 0 ctx.footnotes = Footnotes() @@ -39,7 +40,7 @@ class HtmlFormat(Format): t.find('.//div[@id="content"]').extend( self.render(self.doc.edoc.getroot(), ctx)) - t.find('.//div[@id="toc"]').append(ctx.toc.render()) + #t.find('.//div[@id="toc"]').append(ctx.toc.render()) t.find('.//div[@id="footnotes"]').extend(ctx.footnotes.output) return OutputFile.from_string(etree.tostring( @@ -67,6 +68,12 @@ class LiteralText(TreeRenderer): pass +class Silent(TreeRenderer): + def render_text(self, text, ctx): + root, inner = self.text_container() + return root + + class Footnotes(object): def __init__(self): self.counter = 0 @@ -122,6 +129,7 @@ class TOC(object): # Renderers HtmlFormat.renderers.register(core.Aside, None, NaturalText('aside')) +HtmlFormat.renderers.register(core.Aside, 'comment', Silent()) class AsideFootnote(NaturalText): def render(self, element, ctx): @@ -132,13 +140,60 @@ class AsideFootnote(NaturalText): return root HtmlFormat.renderers.register(core.Aside, 'footnote', AsideFootnote()) + +class Header(NaturalText): + def render(self, element, ctx): + root = super(Header, self).render(element, ctx) + if ctx.toc_level == 1: + d = etree.SubElement(root, 'div', {'class': "page-header"}) + d.insert(0, root[0]) + else: + root[0].tag = 'h2' + if root[0].text: + d = etree.SubElement(root[0], 'a', {'id': root[0].text, 'style': 'pointer: hand; color:#ddd; font-size:.8em'}) + #d.text = "per" + return root + -HtmlFormat.renderers.register(core.Header, None, NaturalText('h1')) +HtmlFormat.renderers.register(core.Header, None, Header('h1')) HtmlFormat.renderers.register(core.Div, None, NaturalText('div')) + +class DivDefined(NaturalText): + def render(self, element, ctx): + output = super(DivDefined, self).render(element, ctx) + output[0].text = (output[0].text or '') + ':' + output[0].attrib['id'] = output[0].text # not so cool? + return output + +HtmlFormat.renderers.register(core.Div, 'defined', DivDefined('dt', {'style': 'display: inline-block'})) + + +class DivImage(NaturalText): + def render(self, element, ctx): + output = super(DivImage, self).render(element, ctx) + src = element.attrib.get('src', '') + if src.startswith('file://'): + src = ctx.files_path + src[7:] + output[0].attrib['src'] = src + output[0].attrib['style'] = 'display: block; width: 60%; margin: 3em auto' + return output + +HtmlFormat.renderers.register(core.Div, 'img', DivImage('img')) + HtmlFormat.renderers.register(core.Div, 'item', NaturalText('li')) HtmlFormat.renderers.register(core.Div, 'list', NaturalText('ul')) +HtmlFormat.renderers.register(core.Div, 'list.enum', NaturalText('ol')) + +class DivListDefinitions(NaturalText): + def render(self, element, ctx): + output = super(DivListDefinitions, self).render(element, ctx) + #if ctx.toc_level > 2: + # output[0].attrib['style'] = 'float: right' + return output + +HtmlFormat.renderers.register(core.Div, 'list.definitions', DivListDefinitions('ul')) HtmlFormat.renderers.register(core.Div, 'p', NaturalText('p')) @@ -158,6 +213,7 @@ HtmlFormat.renderers.register(core.Span, None, NaturalText('span')) HtmlFormat.renderers.register(core.Span, 'cite', NaturalText('cite')) HtmlFormat.renderers.register(core.Span, 'cite.code', LiteralText('code')) HtmlFormat.renderers.register(core.Span, 'emph', NaturalText('em')) +HtmlFormat.renderers.register(core.Span, 'emp', NaturalText('strong')) class SpanUri(LiteralText): def render(self, element, ctx): @@ -165,3 +221,14 @@ class SpanUri(LiteralText): root[0].attrib['href'] = element.text return root HtmlFormat.renderers.register(core.Span, 'uri', SpanUri('a')) + +class SpanLink(LiteralText): + def render(self, element, ctx): + root = super(SpanLink, self).render(element, ctx) + src = element.attrib.get('href', '') + if src.startswith('file://'): + src = ctx.files_path + src[7:] + root[0].attrib['href'] = src + return root +HtmlFormat.renderers.register(core.Span, 'link', SpanLink('a')) + diff --git a/librarian/formats/pdf/__init__.py b/librarian/formats/pdf/__init__.py new file mode 100644 index 0000000..298db09 --- /dev/null +++ b/librarian/formats/pdf/__init__.py @@ -0,0 +1,381 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +import os +import re +import shutil +from subprocess import call, PIPE +from tempfile import NamedTemporaryFile, mkdtemp +from lxml import etree +from urllib import urlretrieve +from StringIO import StringIO +from Texml.processor import process +from librarian import DCNS, XMLNamespace +from librarian.formats import Format +from librarian.output import OutputFile +from librarian.renderers import Register, TreeRenderer +from librarian.utils import Context, get_resource, extend_element +from librarian import core +from PIL import Image +from ..html import Silent + + +TexmlNS = XMLNamespace('http://getfo.sourceforge.net/texml/ns1') + + +def texml_cmd(name, *parms, **kwargs): + cmd = etree.Element(TexmlNS('cmd'), name=name) + for opt in kwargs.get('opts', []): + etree.SubElement(cmd, TexmlNS('opt')).text = opt + for parm in parms: + etree.SubElement(cmd, TexmlNS('parm')).text = parm + return cmd + + +class PdfFormat(Format): + format_name = 'PDF' + format_ext = 'pdf' + tex_passes = 1 + style = get_resource('formats/pdf/res/default.sty') + + local_packages = [ + get_resource('formats/pdf/res/coverimage.sty'), + get_resource('formats/pdf/res/insertimage.sty'), + ] + + renderers = Register() + + def retrieve_file(self, url, save_as): + # TODO: local sheme + return False + + def add_file(self, ctx, filename, url=None, path=None, image=False): + from subprocess import call + assert url or path + save_as = os.path.join(ctx.workdir, filename) + if path is not None: + ext = path.rsplit('.', 1)[-1] + if image: + if ext == 'gif': + call(['convert', path, save_as]) + else: + # JPEGs with bad density will break LaTeX with 'Dimension too large'. + call(['convert', '-units', 'PixelsPerInch', path, '-density', '300', save_as + '_.' + ext]) + shutil.move(save_as + '_.' + ext, save_as) + else: + shutil.copy(path, save_as) + elif not self.retrieve_file(url, save_as): + if url.startswith('file://'): + url = ctx.files_path + url[7:] + + if url.startswith('/'): + url = 'http://milpeer.eu' + url + + ext = url.rsplit('.', 1)[-1] + if image: + urlretrieve(url, save_as + '_.' + ext) + if ext == 'gif': + call(['convert', save_as + '_.' + ext, save_as]) + else: + # JPEGs with bad density will break LaTeX with 'Dimension too large'. + r = call(['convert', '-units', 'PixelsPerInch', save_as + '_.' + ext, '-density', '300', save_as + '_2.' + ext]) + if r: + shutil.move(save_as + '_.' + ext, save_as) + else: + shutil.move(save_as + '_2.' + ext, save_as) + else: + urlretrieve(url, save_as) + + def get_file(self, ctx, filename): + return os.path.join(ctx.workdir, filename) + + def get_texml(self, build_ctx): + t = etree.Element(TexmlNS('TeXML')) + + self.add_file(build_ctx, 'wl.cls', path=get_resource('formats/pdf/res/wl.cls')) + t.append(texml_cmd("documentclass", "wl")) + + # global packages + self.add_file(build_ctx, 'style.sty', path=self.style) + t.append(texml_cmd("usepackage", "style")) + t.append(texml_cmd("usepackage", "hyphenat")) + + # local packages + for i, package in enumerate(self.local_packages): + self.add_file(build_ctx, "librarianlocalpackage%s.sty" % i, path=package) + t.append(texml_cmd("usepackage", "librarianlocalpackage%s" % i)) + + author = ", ". join(self.doc.meta.get(DCNS('creator')) or '') + title = self.doc.meta.title() + t.append(texml_cmd("author", author)) + t.append(texml_cmd("title", title)) + + doc = etree.SubElement(t, TexmlNS('env'), name="document") + doc.append(texml_cmd("thispagestyle", "empty")) + + # title page + height_left = 297 + cover_url = self.doc.meta.get_one(DCNS('relation.coverimage.url')) + if cover_url: + self.add_file(build_ctx, 'cover.png', cover_url, image=True) + + img = Image.open(self.get_file(build_ctx, 'cover.png')) + size = img.size + + if (size[1] > size[0]): + img = img.crop((0, 0, size[0], size[0])) + img.save(self.get_file(build_ctx, 'cover.png'), format=img.format, quality=90) + size = img.size + + # TODO: hardcoded paper size here + height = 210.0 * size[1] / size[0] + doc.append(texml_cmd("makecover", "%fmm" % height)) + else: + doc.append(texml_cmd("vfill*")) + + # Wielkości! + grp = etree.SubElement(doc, 'group') + grp.append(texml_cmd("raggedright")) + grp.append(texml_cmd("vfill")) + if author: + p = texml_cmd("par", "") + grp.append(p) + p[0].append(texml_cmd("Large")) + p[0].append(texml_cmd("noindent")) + p[0].append(texml_cmd("nohyphens", author)) + p[0].append(texml_cmd("vspace", "1em")) + #p[0][-1].tail = author + if title: + p = texml_cmd("par", "") + grp.append(p) + p[0].append(texml_cmd("Huge")) + p[0].append(texml_cmd("noindent")) + p[0].append(texml_cmd("nohyphens", title)) + #p[0][-1].tail = title + doc.append(texml_cmd("vfill")) + doc.append(texml_cmd("vfill")) + + # IOFile probably would be better + cover_logo_url = getattr(build_ctx, 'cover_logo', None) + # TEST + # TODO: convert + #cover_logo_url = 'http://milpeer.mdrn.pl/media/dynamic/people/logo/nowoczesnapolska.org.pl.png' + if cover_logo_url: + self.add_file(build_ctx, 'coverlogo.png', cover_logo_url, image=True) + size = Image.open(self.get_file(build_ctx, 'coverlogo.png')).size + p = texml_cmd("par", "") + doc.append(p) + p[0].append(texml_cmd("noindent")) + p[0].append(texml_cmd("insertimage", 'coverlogo.png', "%fcm" % (1.0 * size[0] / size[1]), "1cm")) + + # logo organizacji! + doc.append(texml_cmd("clearpage")) + + ctx = Context(build_ctx, format=self, img=1) + doc.extend(self.render(self.doc.edoc.getroot(), ctx)) + + # Redakcyjna na końcu. + doc.append(texml_cmd("clearpage")) + + doc.append(texml_cmd("section*", "Information about the resource")) + doc.append(texml_cmd("vspace", "1em")) + + for m, f in ( + ('Publisher: ', DCNS('publisher')), + ('Rights: ', DCNS('rights')), + ('Intended audience: ', DCNS('audience')), + ('', DCNS('description')), + ): + v = self.doc.meta.get_one(f) + if v: + e = texml_cmd("par", "") + e[0].append(texml_cmd("noindent")) + e[0][0].tail = "%s%s" % (m, v) + doc.append(e) + doc.append(texml_cmd("vspace", "1em")) + + + e = texml_cmd("par", "") + e[0].append(texml_cmd("noindent")) + e[0][0].tail = "Resource prepared using " + e[0].append(texml_cmd("href", "http://milpeer.eu", "MIL/PEER")) + e[0][-1].tail = " editing platform. " + doc.append(e) + + source_url = getattr(build_ctx, 'source_url', None) + #source_url = 'http://milpeer.mdrn.pl/documents/27/' + if source_url: + e = texml_cmd("par", "") + doc.append(e) + e[0].append(texml_cmd("noindent")) + e[0][0].tail = "Source available at " + e[0].append(texml_cmd("href", source_url, source_url)) + + return t + + def get_tex_dir(self, ctx): + ctx.workdir = mkdtemp('-wl2pdf') + texml = self.get_texml(ctx) + tex_path = os.path.join(ctx.workdir, 'doc.tex') + with open(tex_path, 'w') as fout: + #print etree.tostring(texml) + process(StringIO(etree.tostring(texml)), fout, 'utf-8') + + #~ if self.save_tex: + #~ shutil.copy(tex_path, self.save_tex) + + + + #for sfile in ['wasysym.sty', 'uwasyvar.fd', 'uwasy.fd']: + # shutil.copy(get_resource(os.path.join('res/wasysym', sfile)), temp) + return ctx.workdir + + def build(self, ctx=None, verbose=False): + temp = self.get_tex_dir(ctx) + tex_path = os.path.join(temp, 'doc.tex') + try: + cwd = os.getcwd() + except OSError: + cwd = None + os.chdir(temp) + + if verbose: + for i in range(self.tex_passes): + p = call(['xelatex', tex_path]) + else: + for i in range(self.tex_passes): + p = call(['xelatex', '-interaction=batchmode', tex_path], + stdout=PIPE, stderr=PIPE) + if p: + #raise ParseError("Error parsing .tex file: %s" % tex_path) + raise RuntimeError("Error parsing .tex file: %s" % tex_path) + + if cwd is not None: + os.chdir(cwd) + + output_file = NamedTemporaryFile(prefix='librarian', suffix='.pdf', delete=False) + pdf_path = os.path.join(temp, 'doc.pdf') + shutil.move(pdf_path, output_file.name) + shutil.rmtree(temp) + os.system("ls -l " + output_file.name) + return OutputFile.from_filename(output_file.name) + + def render(self, element, ctx): + return self.renderers.get_for(element).render(element, ctx) + + + + +class CmdRenderer(TreeRenderer): + def parms(self): + return [] + def container(self): + root = etree.Element(self.root_name) + root.append(texml_cmd(self.tag_name, *(self.parms() + [""]))) + inner = root[0][-1] + return root, inner + +class EnvRenderer(TreeRenderer): + def container(self): + root = etree.Element(self.root_name) + inner = etree.SubElement(root, 'env', name=self.tag_name) + return root, inner + +class GroupRenderer(CmdRenderer): + def container(self): + root = etree.Element(self.root_name) + inner = etree.SubElement(root, 'group') + if self.tag_name: + inner.append(texml_cmd(self.tag_name, *(self.parms() + [""]))) + return root, inner + + +class SectionRenderer(CmdRenderer): + def subcontext(self, element, ctx): + # here? + return Context(ctx, toc_level=getattr(ctx, 'toc_level', 1) + 2) + + def container(self): + root = etree.Element(self.root_name) + root.append(texml_cmd('pagebreak', opts=['1'])) + root.append(texml_cmd(self.tag_name, *(self.parms() + [""]))) + inner = root[1][0] + return root, inner + +PdfFormat.renderers.register(core.Section, None, SectionRenderer('par')) + +# TODO: stopnie +PdfFormat.renderers.register(core.Header, None, CmdRenderer('section*')) + +PdfFormat.renderers.register(core.Div, None, CmdRenderer('par')) + +class ImgRenderer(CmdRenderer): + def parms(self): + return ["", ""] + + def render(self, element, ctx): + root = super(ImgRenderer, self).render(element, ctx) + url = element.get('src') + nr = getattr(ctx, 'img', 0) + ctx.img = nr + 1 + ctx.format.add_file(ctx, 'f%d.png' % nr, url, image=True) + root[0][0].text = 'f%d.png' % nr + try: + size = Image.open(ctx.format.get_file(ctx, 'f%d.png' % nr)).size + except IOError: # not an image + del root[0]; + return root + root[0][1].text = '15cm' + root[0][2].text = '%fcm' % (15.0 * size[1] / size[0]) + return root + +PdfFormat.renderers.register(core.Div, 'img', ImgRenderer('insertimage')) + + +PdfFormat.renderers.register(core.Div, 'defined', CmdRenderer('textbf')) +PdfFormat.renderers.register(core.Div, 'item', CmdRenderer('item')) +PdfFormat.renderers.register(core.Div, 'list', EnvRenderer('itemize')) +PdfFormat.renderers.register(core.Div, 'list.enum', EnvRenderer('enumerate')) + + + +PdfFormat.renderers.register(core.Span, None, TreeRenderer()) +PdfFormat.renderers.register(core.Span, 'cite', CmdRenderer('emph')) +PdfFormat.renderers.register(core.Span, 'cite.code', CmdRenderer('texttt')) +PdfFormat.renderers.register(core.Span, 'emp', CmdRenderer('textbf')) +PdfFormat.renderers.register(core.Span, 'emph', CmdRenderer('emph')) + +class SpanUri(CmdRenderer): + def parms(self): + return [""] + def render(self, element, ctx): + root = super(SpanUri, self).render(element, ctx) + src = element.text + if src.startswith('file://'): + src = ctx.files_path + src[7:] + root[0][0].text = src + return root +PdfFormat.renderers.register(core.Span, 'uri', SpanUri('href')) + + +class SpanLink(CmdRenderer): + def parms(self): + return [""] + def render(self, element, ctx): + root = super(SpanLink, self).render(element, ctx) + src = element.attrib.get('href', '') + if src.startswith('file://'): + src = ctx.files_path + src[7:] + root[0][0].text = src + return root +PdfFormat.renderers.register(core.Span, 'link', SpanLink('href')) + + + + +PdfFormat.renderers.register(core.Aside, None, TreeRenderer()) +PdfFormat.renderers.register(core.Aside, 'editorial', CmdRenderer('editorialpage')) +PdfFormat.renderers.register(core.Aside, 'comment', Silent()) + diff --git a/librarian/formats/pdf/res/TonyJericho.png b/librarian/formats/pdf/res/TonyJericho.png new file mode 100644 index 0000000..08089b6 Binary files /dev/null and b/librarian/formats/pdf/res/TonyJericho.png differ diff --git a/librarian/formats/pdf/res/coverimage.sty b/librarian/formats/pdf/res/coverimage.sty new file mode 100755 index 0000000..4f3f117 --- /dev/null +++ b/librarian/formats/pdf/res/coverimage.sty @@ -0,0 +1,23 @@ +\newcommand{\makecover}[1]{ +% parametry: wysokosc po obcieciu, ile obciac z dolu + \newlength{\PictHOffset} + \newlength{\PictVOffset} + \setlength{\PictHOffset}{1in} + \addtolength{\PictHOffset}{\hoffset} + \addtolength{\PictHOffset}{\oddsidemargin} + + \setlength{\PictVOffset}{1.166in} + %\setlength{\PictVOffset}{0pt} + \addtolength{\PictVOffset}{\voffset} + \addtolength{\PictVOffset}{\topmargin} + \addtolength{\PictVOffset}{\headheight} + \addtolength{\PictVOffset}{\headsep} + \addtolength{\PictVOffset}{\topskip} + \addtolength{\PictVOffset}{-#1} + + \noindent\hspace*{-\PictHOffset}% + \raisebox{\PictVOffset}[0pt][0pt]{\makebox[0pt][l]{% + \includegraphics[width=210mm,height=#1]{cover.png}}} + + \vspace{-\PictVOffset} +} diff --git a/librarian/formats/pdf/res/default.sty b/librarian/formats/pdf/res/default.sty new file mode 100755 index 0000000..40b867d --- /dev/null +++ b/librarian/formats/pdf/res/default.sty @@ -0,0 +1,33 @@ +\usepackage[MeX]{polski} + +\newcommand{\rightsinfostr}[2][] { + \ifx&% + #2 + \else + Ten utwór jest udostępniony na licencji + \href{#1}{#2}. + \fi +} + + +\renewcommand{\maketitle}{} + +\newcommand{\editorialsection}{ + \begin{figure}[b!] + { + \footnotesize + \color{theme} + \noindent \rule{\linewidth}{0.4pt} + + \rightsinfo + \vspace{.6em} + + \editors + + \vspace{.6em} + \coverby + + \color{black} + } + \end{figure} +} diff --git a/librarian/formats/pdf/res/insertimage.sty b/librarian/formats/pdf/res/insertimage.sty new file mode 100644 index 0000000..9fbcb9d --- /dev/null +++ b/librarian/formats/pdf/res/insertimage.sty @@ -0,0 +1,5 @@ +\newcommand{\insertimage}[3]{ + + \includegraphics[width=#2,height=#3]{#1} + +} diff --git a/librarian/formats/pdf/res/template.texml b/librarian/formats/pdf/res/template.texml new file mode 100644 index 0000000..1eb8f78 --- /dev/null +++ b/librarian/formats/pdf/res/template.texml @@ -0,0 +1,12 @@ + + + + \documentclass{wl} + \usepackage{style} + \usepackage{coverimage} + + + + + + diff --git a/librarian/formats/pdf/res/wl.cls b/librarian/formats/pdf/res/wl.cls new file mode 100755 index 0000000..f336749 --- /dev/null +++ b/librarian/formats/pdf/res/wl.cls @@ -0,0 +1,426 @@ +% -*- coding: utf-8 -*- +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{wl}[2011/11/28 wolnelektury.pl book style] + +% PDF customizations +% +% nofootnotes - disable generation of footnotes +% nothemes - disable generation of themes +% defaultleading - default leading +% onehalfleading - leading of 1.5 (interlinia) +% doubleleading - double leading (interlinia) +% a4paper,... - paper size as required by LaTeX +% nowlfont - don't use customized WL font + +\RequirePackage{setspace} +\RequirePackage{type1cm} +%\RequirePackage{wasysym} +\DeclareOption{13pt}{% +\AtEndOfClass{% +% font size definitions, similar to ones in /usr/share/texmf-texlive/tex/latex/base/ +\renewcommand\normalsize{% + \@setfontsize\normalsize{13pt}{14.5pt}% + \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI}\normalsize% +\renewcommand\footnotesize{% + \@setfontsize\footnotesize\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% + \belowdisplayskip \abovedisplayskip +}% +}% +} + +%% \DeclareOption{14pt}{\renewcommand{\normalsize}{\AtEndOfClass{\fontsize{14}{17}\selectfont}}} + +\DeclareOption{defaultleading}{} +\DeclareOption{doubleleading}{\AtBeginDocument{\doublespacing}}%\setlength{\leading}{1em plus 0.5ex minus 0.2ex}} +\DeclareOption{onehalfleading}{\AtBeginDocument{\onehalfspacing}}%\setlength{\leading}{1em plus 0.5ex minus 0.2ex}} + +%% This does not really work, since dvipdfm(x) will use it's configuration in /etc/texmf/dvipdfm(x) and force a global paper size setting. +\DeclareOption{a5paper}{% + \setlength{\paperheight}{210mm}% + \setlength{\paperwidth}{148mm}} + + +\newif\ifshowfootnotes \showfootnotestrue +\DeclareOption{nofootnotes}{\showfootnotesfalse} + +\newif\ifshowthemes \showthemestrue +\DeclareOption{nothemes}{\showthemesfalse} + +\newif\ifenablewlfont \enablewlfonttrue +\DeclareOption{nowlfont}{\enablewlfontfalse} + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}} +\ProcessOptions\relax +\LoadClass[a4paper,oneside]{book} + + +\usepackage{trace} + +\usepackage[xetex]{graphicx} +\usepackage{fontspec} +\usepackage{xunicode} +\usepackage{xltxtra} + +\usepackage[overload]{textcase} +\usepackage{scalefnt} +% TODO: link color is a style thing +\usepackage[hyphens]{url} +\usepackage[colorlinks=true,linkcolor=black,setpagesize=false,urlcolor=blue,xetex]{hyperref} + +\ifenablewlfont +\setmainfont [ +%ExternalLocation, +%UprightFont = Dosis-Regular, +UprightFont = JunicodeWL-Regular, +%ItalicFont = Dosis-SemiBold, +%BoldFont = Dosis-Bold, +%BoldItalicFont = Dosis-Bold, +%SmallCapsFont = Dosis-Regular, +ItalicFont = JunicodeWL-Italic, +BoldFont = Junicode-Bold, +%BoldFont = Junicode-Italic, +BoldItalicFont = Junicode-BoldItalic, +SmallCapsFont = JunicodeWL-Regular, +SmallCapsFeatures = {Letters={SmallCaps,UppercaseSmallCaps}}, +Numbers=OldStyle, +Scale=1.04, +LetterSpace=-1.0 +] {Junicode} + +%\newfontfamily\alien[ +%\setmainfont[ +%SmallCapsFeatures = {Letters={SmallCaps,UppercaseSmallCaps}}, +%Numbers=OldStyle, +%Scale=0.85, +%LetterSpace=-1.0 +%] {FreeSans} +%\setmainfont{FreeSans} + + +\defaultfontfeatures{ +SizeFeatures={ + {Size={-10.5}, FakeStretch=1.02, LetterSpace=2.0 }, + {Size={10.5-12}, FakeStretch=2.00, LetterSpace=0.0 }, + {Size={12-}, FakeStretch=0.98, LetterSpace=-2.0 } +} +} + +\renewcommand{\textsc}[1]{% +{\addfontfeature{ +SizeFeatures={ + {Size={-10.5}, Scale=1.2, FakeStretch=1.02, LetterSpace=8.0 }, + {Size={10.5-12}, Scale=1.2, FakeStretch=1.02, LetterSpace=8.0 }, + {Size={12-}, FakeStretch=1.0, LetterSpace=8.0 } +}, +Letters={SmallCaps,UppercaseSmallCaps} +} +#1} +} +\fi% enablewlfont + +%{\Itshape JunicodeWL-Italic.ttf } +%{\bfseries Junicode-Bold.ttf } +%{\bfseries\itshape Junicode-BoldItalic.ttf } + +\pagestyle{plain} +\usepackage{fancyhdr} + +\makeatletter + +% bottom figure below footnotes +\usepackage{fnpos} +\makeFNabove + +\usepackage{color} +\definecolor{theme}{gray}{.3} + + +\setlength{\marginparsep}{2em} +%\setlength{\marginparwidth}{8.5em} +\setlength{\marginparwidth}{2.5cm} +\setlength{\oddsidemargin}{0pt} +\setlength{\voffset}{0pt} +\setlength{\topmargin}{0pt} +\setlength{\headheight}{0pt} +\setlength{\headsep}{0pt} +\setlength{\textheight}{24cm} +\setlength{\textwidth}{16cm} + + +\pagestyle{fancy} +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\lfoot{{\footnotesize \@author{} \emph{\@title}}} +\cfoot{} +\rfoot{{\footnotesize \thepage}} + +\clubpenalty=100000 +\widowpenalty=100000 + + +% see http://osdir.com/ml/tex.xetex/2005-10/msg00003.html +\newsavebox{\ximagebox}\newlength{\ximageheight} +\newsavebox{\xglyphbox}\newlength{\xglyphheight} +\newcommand{\xbox}[1] +{\savebox{\ximagebox}{#1}\settoheight{\ximageheight}{\usebox {\ximagebox}}% +\savebox{\xglyphbox}{\char32}\settoheight{\xglyphheight}{\usebox {\xglyphbox}}% +\raisebox{\ximageheight}[0pt][0pt]{%\raisebox{-\xglyphheight}[0pt] [0pt]{% +\makebox[0pt][l]{\usebox{\xglyphbox}}}%}% +\usebox{\ximagebox}% +\raisebox{0pt}[0pt][0pt]{\makebox[0pt][r]{\usebox{\xglyphbox}}}} + + + +\newcommand{\typosubsubsection}[1]{% +{#1} +} + +\newcommand{\typosubsection}[1]{% +{\addfontfeature{ +SizeFeatures={ + {Size={-10}, Scale=1.2, FakeStretch=1.00, LetterSpace=8.0 }, + {Size={10.5-12}, Scale=1.2, FakeStretch=1.00, LetterSpace=8.0 }, + {Size={12-}, FakeStretch=1.0, LetterSpace=8.0 } +}, +Letters={Uppercase} +} +\MakeUppercase{#1}} +} + +\newcommand{\typosection}[1]{% +{\addfontfeature{FakeStretch=0.96, LetterSpace=-4.0}\emph{\scalefont{2}#1}} +%{\addfontfeature{Scale=2.0, FakeStretch=0.98, LetterSpace=-2.0}\emph{#1}} +} + + +\newcommand{\tytul}[1]{% +#1% +\vspace{1em}% +} + +\newcommand{\nazwapodutworu}[1]{% +\section*{\typosection{#1}}% +} + +\newcommand{\autorutworu}[1]{% +\subsection*{\typosubsection{#1}}% +} + +\newcommand{\dzielonadrzedne}[1]{% +\subsection*{\typosubsubsection{#1}}% +} + +\newcommand{\nazwautworu}[1]{% +\section*{\raggedright{\typosection{#1}}}% +} + +\newcommand{\podtytul}[1]{% +\subsection*{\typosubsubsection{#1}}% +} + +\newcommand{\translator}[1]{% +% TODO: l10n is a style thing +\subsection*{\typosubsubsection{tłum. #1}}% +} + + +\newcommand{\powiesc}[1]{#1} +\newcommand{\opowiadanie}[1]{#1} +\newcommand{\lirykal}[1]{#1} +\newcommand{\lirykalp}[1]{#1} +\newcommand{\dramatwierszowanyl}[1]{#1} +\newcommand{\dramatwierszowanylp}[1]{#1} +\newcommand{\dramatwspolczesny}[1]{#1} + +\newcommand{\nota}[1]{% +\par{#1}% +} + +\newcommand{\dedykacja}[1]{% +\begin{em}% +\begin{flushright}% +#1% +\end{flushright}% +\end{em}% +} + +\newcommand{\dlugicytat}[1]{% +\begin{quotation}% +#1% +\end{quotation}% +} + +\newcommand{\poezjacyt}[1]{% +\begin{verse}% +#1% +\end{verse}% +} +\newcommand{\motto}[1]{% +\begin{em}% +#1% +\end{em}% +} +\newcommand{\listaosob}[2]{% +\par{#1}% +\begin{itemize}% +#2% +\end{itemize}% +} + +\newcommand{\nagloweklisty}[1]{% +\typosubsubsection{#1}% +} + +\newcommand{\listaosoba}[1]{% +\item{#1}% +} + +\newcommand{\kwestia}[1]{% +\par{#1}% +} + +\newcommand{\naglowekakt}[1]{% +\pagebreak +\subsection*{\typosubsection{#1}}% +} +\newcommand{\naglowekczesc}[1]{% +\pagebreak +\subsection*{\typosubsection{#1}}% +} +\newcommand{\srodtytul}[1]{% +\subsection*{\typosubsection{#1}}% +} + +\newcommand{\naglowekscena}[1]{% +\subsubsection*{\typosubsubsection{#1}}% +} +\newcommand{\naglowekrozdzial}[1]{% +{\subsubsection*{\raggedright{\typosubsubsection{#1}}}}% +} + +\newcommand{\naglowekosoba}[1]{% +\par{\textsc{#1}}\nopagebreak% +} +\newcommand{\naglowekpodrozdzial}[1]{% +\par{#1}\nopagebreak% +} + +\newcommand{\miejsceczas}[1]{% +\par{\emph{#1}}% +} +\newcommand{\didaskalia}[1]{% +\par{\emph{#1}}% +} + +\newcommand{\akap}[1]{% +\par{#1}% +} +\newcommand{\akapdialog}[1]{% +\par{#1}% +} +\newcommand{\akapcd}[1]{% +\par{#1}% +} + +\newcommand{\mottopodpis}[1]{% +\begin{em}% +\begin{flushright}% +#1% +\end{flushright}% +\end{em}% +} + +\newcommand{\strofa}[1]{% +\par{\noindent{\ignorespaces#1\vspace{1em}}}% +} + +\newcommand{\wers}[1]{#1} + +\newcommand{\wersakap}[1]{% +\hspace*{1em}#1% +} +\newcommand{\werscd}[1]{% +\hspace*{8em}#1% +} +\newcommand{\werswciety}[2][1em]{% +\hspace*{#1}#2% +} + +\ifshowfootnotes + \newcommand{\pa}[1]{\NoCaseChange{\footnote{#1}}} + \newcommand{\pe}[1]{\NoCaseChange{\footnote{#1}}} + \newcommand{\pr}[1]{\NoCaseChange{\footnote{#1}}} + \newcommand{\pt}[1]{\NoCaseChange{\footnote{#1}}} +\else + \newcommand{\pa}[1]{} + \newcommand{\pe}[1]{} + \newcommand{\pr}[1]{} + \newcommand{\pt}[1]{} +\fi + +\newcommand{\mat}[1]{$#1$} + +\newcommand{\didasktekst}[1]{% +\emph{#1}% +} +\newcommand{\slowoobce}[1]{% +\emph{#1}% +} +\newcommand{\tytuldziela}[1]{% +\emph{#1}% +} +\newcommand{\wyroznienie}[1]{% +\emph{#1}% +} + +\newcommand{\osoba}[1]{% +#1% +} + +\newcommand{\sekcjaswiatlo}{% +\vspace{30pt}% +} + +\newcommand{\sekcjaasterysk}{% +\vspace{10pt}% +\begin{center}% +\par{*}% +\end{center}% +} + +\newcommand{\separatorlinia}{% +\vspace{10pt}% +\hrule{}% +\vspace{10pt}% +} + +\newcommand{\motyw}[2][0]{% +\ifshowthemes +\mbox{}% +\marginpar{% +\vspace{-8pt}% +\vspace{-#1\baselineskip}% +\raggedright{\hspace{0pt}% +\footnotesize{\color{theme}{#2}}}% +\vspace{\baselineskip}% +}% +\fi +} + + +\newcommand{\editorialpage}[1]{% +#1% +\pagebreak% +} diff --git a/librarian/formats/pdf/res/wl2tex.xslt b/librarian/formats/pdf/res/wl2tex.xslt new file mode 100755 index 0000000..f36172d --- /dev/null +++ b/librarian/formats/pdf/res/wl2tex.xslt @@ -0,0 +1,441 @@ + + + + + + + + + + \documentclass[]{wl} + \usepackage{style} + + \usepackage{makecover} + + + + + + \usepackage[maxfloats=64]{morefloats} + + + + + \usepackage{morefloats} + + + + + + \IfFileExists{morefloats.sty}{ + \usepackage{morefloats} + }{} + + + + + + + + + + + mm + 210mm + + + + + + + + + + + + + + + + + + + + + + + + + + + \def\coverby{ + + + + Okładka na podstawie: + + + + + + + + + + + + + + + } + \def\editors{} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \def\authors{} + \author{\authors} + \title{} + \def\translatorsline{} + + \def\bookurl{} + + \def\rightsinfo{ + + + + + + + } + + + \def\sourceinfo{ + + Tekst opracowany na podstawie: + \vspace{.6em} + + } + \def\description{ + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \\{} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wers + + + + em + + + + + + + + + + + + + + + + + + + + + + + + „” + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + + + + Opracowanie redakcyjne i przypisy: + + . + + + + + + + + , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/milpdf/a.xml b/milpdf/a.xml new file mode 100644 index 0000000..460f9ff --- /dev/null +++ b/milpdf/a.xml @@ -0,0 +1,4 @@ +
Modern Poland FoundationenglishCreative Commons Attribution – Share Alike18+https://farm6.staticflickr.com/5308/5729009434_0038a5a6fb_o.jpg + +
Relations in the media environment
I
knows how to consciously create her image depending on needs or a recipient; e.g. knows how to use words and body language during lectures.
can react in a crisis situation concerning her image, e.g. demands deleting untrue information about her by sending corrections to website's administrators.
I and others
can convince others through media, adjusting the message to its recipient and to the goal of the communication, e.g. knows how to discuss about an article, without offending the interlocutor.
can influence others thanks to proper language and chosen channels of communication, e.g. can convince friends from social media to social activism on the university.
knows that communication through media has its limitations and can counteract them, e.g. calls or talks directly if chat on instant messenger is not possible/
is aware that some recipients of her messages may be less competent. Can adjust her messages to recipients' capabilities, e.g. knows that some scholars rarely check their e-mails, so when necessary is able to find other effective means of communication.
I and environment
knows the internet and reality permeat each other, and rules of human relationships are very similar, e.g. knows that group work when done remotely requires the same commitment as in person.
knows that part of social life happens through media, e.g. knows that a party may happen on the internet.
can plan and activate a group via different, virtual and real media, e.g. coordinates the preparations to student self-government elections.
+
diff --git a/milpdf/m.xml b/milpdf/m.xml new file mode 100644 index 0000000..b391d62 --- /dev/null +++ b/milpdf/m.xml @@ -0,0 +1,151 @@ +
+ + przedszkole + Zuzanna Zasacka + Izabela Machnowska + + Zuzanna Zasacka + Izabela Machnowska + course + Publikacja zrealizowana w ramach projektu Cyfrowa Przyszłość, dofinansowanego ze środków Ministerstwa Kultury i Dziedzictwa Narodowego. + 2014/0/wychowanie-przedszkolne/c7 + http://milpeer.mdrn.pl/media/dynamic/uploads/13/3512808721_202609103f_b.jpg + + + + +
Animacja - robimy film rysunkowy
+
+
Wiedza w pigułce +
Porównanie sposobu zaprezentowania informacji w wielu różnych źródłach pozwala na celniejszą ocenę, który materiał będzie dla ciebie najprzydatniejszy. Sprzyja również krytycznemu spojrzeniu na dostępne źródła — dzięki temu łatwiej możemy wskazać intencję nadawcy, a także stopień wiarygodności przekazu.
Jednym z najważniejszych czynników kształtujących przekazy medialne jest intencja nadawcy — a więc to, co chciał osiągnąć poprzez rozpowszechnienie utworu czy tekstu. Wpływa na nią nie tylko cel czy funkcja komunikatu (np. zareklamowanie, przekonanie do danego poglądu czy informowanie), lecz także jego grupa docelowa. W inny sposób mówi się do młodzieży, w inny do dorosłych; w inny do znawców dziedziny, inaczej do laików.
Rzadko kiedy zdarzają się bezstronne artykuły, a i one przekazują tylko wybrane informacje na dany temat. Oddzielenie opinii od faktów jest kluczowe w krytycznej ocenie tekstów. Dzięki niej możesz uniknąć manipulacji, a także nieświadomego przyjmowania perspektywy autora. Większość materiałów dostępnych w internecie zawiera opinie ich twórców. Nawet jeśli na pierwszy rzut oka artykuł jest informacyjny, podczas uważnej lektury można dostrzec wyznaczniki subiektywnego punktu widzenia.
Zlewanie się informacji i opinii łatwo zaobserwować w reklamach. Z jednej strony opowiadają one o produkcie, z drugiej zaś przedstawiają jego subiektywną ocenę. Podczas odbioru przekazów medialnych warto zwracać uwagę na pojawianie się takich oceniających określeń.
Na to, w jaki sposób prezentowane są informacje, wpływają nie tylko opinie autorów. Również zastosowany gatunek medialny narzuca określony sposób mówienia o danym temacie: czego innego oczekujemy od felietonu, a czego innego od radiowego wydania wiadomości. Charakter i ograniczenia źródła zależą również od kanału komunikacyjnego, np. informacje zamieszczone w internecie są często aktualniejsze niż książki. Nie mogą one również oddziaływać na zmysł słuchu, w przeciwieństwie do radia czy telewizji.
Warto jednocześnie pamiętać, że do niektórych źródeł można dotrzeć poprzez różne kanały komunikacyjne. Dotyczy to m. in. codziennej prasy, drukowanej i udostępnianej w sieci.
Niezależnie od różnych czynników wpływających na kształt przekazów, najważniejszym kryterium ich oceny jest zawsze ich wiarygodność.
+
+
teacher + +
Pomysł na lekcję +
+
Podczas zajęć dzieci spróbują zrobić własny, krótki film animowany. Na początku narysują po kolei każdą klatkę, po czym "historia" zostanie sfilmowana przez prowadzącego.
+
+
Cele operacyjne +
+
+ Uczestnicy i uczestniczki: +
wiedzą, czym jest film rysunkowy;
wiedzą, za pomocą jakich narzędzi medialnych można przygotować taki film;
wiedzą, że proste treści medialne można przetwarzać.
+
+
+
+
Przebieg zajęć +
+
+
1.
Poproś dzieci, aby spróbowały wymienić tytuły filmów animowanych, które oglądały w domu lub w przedszkolu.
+
+
Czas
+ + 5 +
+
Metoda
+ + rozmowa +
+
Pomoce
+ + +
+
+
+
2.
Zabawa ruchowa ,,Słoneczko się budzi, słoneczko zasypia". W miejscu przeznaczonym do ćwiczeń ruchowych dzieci wraz z nauczycielem siedzą w dużym, wspólnym kole - siad skrzyżny, dłonie na kolanach, głowa opuszczona w dół. Na hasło nauczyciela ,,film" każde dziecko kolejno (zaczynając od pierwszego po prawej stronie nauczyciela) kładzie się na podłogę (,,przykleja" plecy do podłogi) i mocno naprężone i wyciągnięte ręce kładzie równolegle wzdłuż głowy (,,przykleja" ręce do podłogi), imitując tym samym promyk słońca. Kiedy wszystkie dzieci wykonały już swoje ruchy i całe ,,otwarte", duże słońce z promykami leży na podłodze, nauczyciel ponownie wypowiada hasło ,,film", a dzieci kolejno wracają do pozycji wyjściowej (słoneczko zasypia). UWAGA! Ćwiczenie należy wykonać bardzo płynnie, bez przerw, we wspólnym rytmie - chodzi tu o uzyskanie tzw. ,,efektu fali". Żeby doprowadzić do oczekiwanego rezultatu, powtórz ćwiczenie kilka razy. Jeśli masz czas, poproś wybrane dziecko o nakręcenie komórką dokumentującego zabawę filmiku.
+
+
Czas
+ 10 +
+
Metoda
+ zabawa +
+
Pomoce
+ +
+
+
-
+
+
3.
Rozdaj każdemu dziecku kartkę formatu A5 z narysowanym przez ciebie przedtem kółkiem na środku. Podziel dzieci na grupy stolikami. Przy pierwszym stoliku dzieci dorysowują po dwa promyczki na każdej kartce, przy drugim stoliku dzieci rysują po pięć promyków, przy trzecim ,,mnóstwo", ,,dużo" promyków. Jeśli dzieci jest więcej, nauczyciel, w czasie wykonywania przez dzieci prac, zbiera już gotowe kartki z dorysowanymi promykami i na bieżąco zanosi je do czwartego stolika, gdzie rysowane są tylko smutne lub wesołe buźki. Pod koniec zepnij wszystkie kartki spinaczem (typu czarny metalowy klips).
+
+
Czas
+ 10 +
+
Metoda
+ zabawa +
+
Pomoce
+ kartki A5 dla każdej uczestniczki/uczestnika, kredki +
+
+
+
+
4.
Zabawa dźwiękonaśladowcza ,,Ciszej - głośniej". Nauczyciel tworzy z dziećmi muzykę do filmu. W tym celu ćwiczy z dziećmi odgłosy znane dzieciom ze środowiska naturalnego np: wiatr (szszszszszszszsz), konik (tzw. ,,języczki"), pies (hau,hau), kraczące wrony, szczekające psy na wsi, itp. W tym ćwiczeniu ważne jest, aby dzieci nie przekrzykiwały się nawzajem oraz zwracały uwagę na dynamikę (głośniej, ciszej), którą wskazuje nauczyciel, dyrygując rękami.
+
+
Czas
+
5
+
+
Metoda
+ zabawa +
+
Pomoce
+ +
+
+
+
5.
Spróbuj nakręcić film z dziecięcych animacji. Będziesz potrzebował/a urządzenia z funkcją filmowania (aparatu lub komórki). Najlepiej uchwycić moment kartkowania. Każdy filmik będzie miał parę sekund. Nakręćcie różne wersje filmu. Np.: za pierwszym razem Janek kciukiem kartkuje rysunki, nauczyciel kręci film, dziewczynki imitują głosem podkład dźwiękowy ,,wiatr", za drugim razem Piotrek kręci film, Ania kartkuje kciukiem, a chłopcy robią podkład dźwiękowy ,,koniki" itd. Na koniec wspólnie wybierzcie najlepszą wersję.
+
+
Czas
+
15
+
+
Metoda
+ zabawa +
+
Pomoce
+ komórka lub aparat z funkcją nagrywania +
+
+
+
+
+
+
Ewaluacja +
+
Czy po przeprowadzeniu zajęć ich uczestnicy i uczestniczki: +
umieją, przy wsparciu dorosłych, pokazać grupie efekty samodzielnego tworzenia i przetwarzania komunikatów?
+
+
+
+
Opcje dodatkowe +
+
Jeśli masz więcej czasu, w pierwszym zadaniu możesz pokazać starszym przedszkolakom znaleziony w internecie przykładowy filmik o tym, jak powstaje film animowany. Najlepiej, gdy będzie to jakaś popularna wśród dzieci produkcja.
+
+
+
+
Słowniczek +
+
+
+
wiarygodność
+ cecha tego, co wiarygodne, czyli rzetelne i godne zaufania +
+
+
źródło informacji
+ każdy przedmiot z którego czerpie się wiadomości na interesujący nas temat +
+
+
+
+
Czytelnia +
+
+
"Animacja i jej rodzaje" w Samouczku na stronie Muzuem Animacji Semafor [dostęp: 21.01.2015], dostępny w internecie: http://muzeum.se-ma-for.com/samouczek/animacja-i-jej-rodzaje-pl
+
" Jak to działa, czyli przygotuj własną animację" [dostęp: 21.01.2015], dostępny w internecie: http://www.nina.gov.pl/edukacja/pracownia/artyku%C5%82/2012/05/30/jak-to-dziala---czyli-przygotuj-wlasna-animacje_
+
+
+
diff --git a/milpdf/p.xml b/milpdf/p.xml new file mode 100644 index 0000000..190fed2 --- /dev/null +++ b/milpdf/p.xml @@ -0,0 +1,56 @@ +
engChildrenhttp://milpeer.mdrn.pl/media/dynamic/uploads/27/smartie.pngAn Author + + + +
The adventures of Smartie the Penguin
+ +
+
It was late at night and Smartie the Penguin was +WIDE awake... He was supposed to be fast asleep +but tomorrow was his birthday. He was so +excited; all he wanted was a new computer!
+
+
+ +
+
The big day came and Smartie had really enjoyed +his birthday party. He had saved his biggest and +most exciting looking present until the very end, +“Oh please, please, please!” he thought as he +began to open it.
+
+
+ +
+
Smartie tore off the +wrapping paper in a hurry, +it was exactly what he +wanted, a brand new +laptop!
+
+
“Oh! Thank +you, thank you, +thank you!” He +cried.
+
+
+ +
+
Daddy Penguin was +extremely clever and +knew all about +computers and how to +get on to the internet. +He helped Smartie to +find his favourite +website and soon +Smartie was happily +playing a game online.
+
+
+ + +