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
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)
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)
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
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)
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
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()
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)
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
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
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
def fix_wordpress(note): """ Fixes wordpress-embedded mathjax. """ n = Note(note) wordpress.fix_mathjax(n)
def export_presentation(note, outdir): """ Export a note as a portable presentation. """ n = Note(note) presentation.compile_presentation(n)
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)