Beispiel #1
0
def n(path):
    path = urllib.unquote(path)
    note = Note(path)

    if os.path.isfile(note.path.abs):

        if request.method == 'PUT':
            text = request.form['text']
            note.write(text)

        raw = note.content

        if note.ext == '.md':
            content = md2html.compile_markdown(raw)
        else:
            content = raw

        return jsonify({
            'title': note.title,
            'html': content,
            'path': path,
            'raw': raw,
            'nburl': quote(note.notebook.path.rel)
        })

    else:
        return 'Not found.', 404
Beispiel #2
0
def n(path):
    path = urllib.unquote(path)
    note = Note(path)

    if os.path.isfile(note.path.abs):

        if request.method == 'PUT':
            text = request.form['text']
            note.write(text)

        raw = note.content

        if note.ext == '.md':
            content = md2html.compile_markdown(raw)
        else:
            content = raw

        return jsonify({
            'title': note.title,
            'html': content,
            'path': path,
            'raw': raw,
            'nburl': quote(note.notebook.path.rel)
        })


    else:
        return 'Not found.', 404
Beispiel #3
0
def watch_presentation(note, outdir):
    """
    Watches a presentation note and its assets directory
    and exports an updated version on changes.
    """
    n = Note(note)
    presentation.watch_presentation(n, outdir)
Beispiel #4
0
    def on_created(self, event):
        p = event.src_path.decode('utf-8')

        logger.log.debug(u'Created: {0}'.format(p))
        if not event.is_directory:
            note = Note(p)
            self.n.index.add_note(note)
Beispiel #5
0
def upload():
    file = request.files['file']

    allowed_content_types = ['image/gif', 'image/jpeg', 'image/png']
    content_type = file.headers['Content-Type']
    if content_type in allowed_content_types:
        path = os.path.join(request.form['notebook'], request.form['title'] +
                            '.ext')  # some arbitrary extension
        note = Note(path)

        resources = note.resources
        if not os.path.exists(resources):
            os.makedirs(resources)

        # Build a unique filename.
        _, ext = os.path.splitext(file.filename)
        if not ext:
            ext = '.' + content_type.split('/')[-1]
        if ext == '.jpeg': ext = '.jpg'
        filename = str(hash(file.filename + str(datetime.utcnow()))) + ext

        save_path = os.path.join(resources, filename)

        file.save(save_path)
        return save_path.replace(server.n.notes_path, ''), 200

    else:
        return 'Content type of {0} not allowed'.format(content_type), 415
Beispiel #6
0
    def on_moved(self, event):
        src = event.src_path
        dest = event.dest_path

        logger.log.debug('Moved: {0} to {1}'.format(src, dest))
        if not event.is_directory:
            src_note = Note(src)
            dest_note = Note(dest)

            # move this note's assets
            if os.path.exists(src_note.assets):
                shutil.move(src_note.assets, dest_note.assets)

        # update all references to this
        # path in any .md files.
        self.update_references(src, dest)
Beispiel #7
0
def editor():
    form = request.form
    ext = '.md' if form['save_as_markdown'] else '.html'
    path = os.path.join(form['notebook'], form['title'] + ext)
    note = Note(path)

    if request.method == 'POST':
        save(note, form)
        return 'Created', 201

    elif request.method == 'PUT':
        save(note, form)
        return 'Updated', 200

    elif request.method == 'DELETE':
        note.delete()
        return 'Deleted', 204
Beispiel #8
0
def editor():
    form = request.form
    ext = '.md' if form['save_as_markdown'] else '.html'
    path = os.path.join(form['notebook'], form['title'] + ext)
    note = Note(path)

    if request.method == 'POST':
        save(note, form)
        return 'Created', 201

    elif request.method == 'PUT':
        save(note, form)
        return 'Updated', 200

    elif request.method == 'DELETE':
        note.delete()
        return 'Deleted', 204
Beispiel #9
0
    def on_deleted(self, event):
        p = event.src_path.decode('utf-8')

        logger.log.debug(u'Deleted: {0}'.format(p))
        if not event.is_directory:
            note = Note(p)
            self.n.index.delete_note(note)
        else:
            self.n.index.update()
Beispiel #10
0
    def on_moved(self, event):
        src = event.src_path.decode('utf-8')
        dest = event.dest_path.decode('utf-8')

        logger.log.debug(u'Moved: {0} to {1}'.format(src, dest))
        if not event.is_directory:
            src_note = Note(src)
            dest_note = Note(dest)

            if os.path.exists(src_note.assets):
                shutil.move(src_note.assets, dest_note.assets)

            self.n.index.delete_note(src_note)
            self.n.index.add_note(dest_note)

        else:
            self.n.index.update()

        # Update all references to this
        # path in any .md or .html files.
        self.update_references(src, dest)
Beispiel #11
0
    def search(self,
               query,
               delimiters=('<b>', '</b>'),
               window=150,
               include_pdf=False,
               html_out=False):
        """search across txt/md and pdf files
        window -> num characters to show before/after match
        delimiters -> what to surround matches with
        html_out -> whether or not output will be to html
        """
        results = []
        for note_path, matches in search(query).items():
            note = Note(note_path)
            highlights = []
            for text, positions in matches:
                for start, end in positions:
                    frm = max(0, start - window)
                    to = min(len(text), start + end + window)
                    snippet = \
                        self._process(text[frm:start], escape=html_out) + \
                        delimiters[0] + \
                        self._process(text[start:start+end], escape=html_out) + \
                        delimiters[1] + \
                        self._process(text[start+end:to], escape=html_out)

                    if frm > 0:
                        snippet = '...{}'.format(snippet)
                    if to < len(text):
                        snippet = '{}...'.format(snippet)
                    highlights.append(snippet)
            results.append((note, highlights))

        if include_pdf:
            # we don't get match positions for pdfs, unfortunately
            for note_path, matches in search_pdf(query, window).items():
                note = Note(note_path)
                results.append((note, matches))
        return results
Beispiel #12
0
def view_note(path):
    """returns the note at the specified path"""
    path = parse.unquote(path)
    note = Note(path)

    if os.path.isfile(note.path.abs):
        if note.ext == '.md':
            content = md2html.compile_markdown(note.content)
        else:
            content = note.content

        return render_template('note.html',
            note={
                'title': note.title,
                'html': content,
                'path': path,
            }, breadcrumbs=breadcrumbs(path))
    else:
        return 'Not found.', 404
Beispiel #13
0
 def search(self, query, html=False):
     """
     Yield search results for a query.
     """
     parser = parsers.HighlightParser()
     with self.ix.searcher() as searcher:
         # To prevent duplicate results.
         result_ids = []
         for field in ['content', 'title']:
             q = QueryParser(field, self.ix.schema).parse(query)
             results = searcher.search(q, limit=None)
             results.fragmenter.charlimit = None
             results.fragmenter.surround = 100
             for result in [
                     r for r in results if r.docnum not in result_ids
             ]:
                 result_ids.append(result.docnum)
                 highlights = result.highlights('content')
                 note = Note(result['path'])
                 if not html:
                     parser.feed(highlights)
                     highlights = parser.get_data()
                 yield note, highlights
Beispiel #14
0
def fix_wordpress(note):
    """
    Fixes wordpress-embedded mathjax.
    """
    n = Note(note)
    wordpress.fix_mathjax(n)
Beispiel #15
0
def export_presentation(note, outdir):
    """
    Export a note as a portable presentation.
    """
    n = Note(note)
    presentation.compile_presentation(n)
Beispiel #16
0
 def on_modified(self, event):
     if not event.is_directory:
         note = Note(event.src_path)
         logger.log.debug(u'Modified: {0}'.format(note.path.rel))
         if os.path.exists(note.path.abs):
             self.n.index.update_note(note)