def _extract_attrs(x, n): """Extracts attributes for an image. n is the index where the attributes begin. Extracted elements are deleted from the element list x. Attrs are returned in pandoc format. """ try: return extract_attrs(x, n) except (ValueError, IndexError): if PANDOCVERSION < '1.16': # Look for attributes attached to the image path, as occurs with # image references for pandoc < 1.16 (pandoc-fignos Issue #14). # See http://pandoc.org/MANUAL.html#images for the syntax. # Note: This code does not handle the "optional title" for # image references (search for link_attributes in pandoc's docs). assert x[n - 1]['t'] == 'Image' image = x[n - 1] s = image['c'][-1][0] if '%20%7B' in s: path = s[:s.index('%20%7B')] attrs = unquote(s[s.index('%7B'):]) image['c'][-1][0] = path # Remove attr string from the path return PandocAttributes(attrs.strip(), 'markdown').to_pandoc() raise
def attach_attrs_table(key, value, fmt, meta): """Extracts attributes and attaches them to element.""" # We can't use attach_attrs_factory() because Table is a block-level element if key in ['Table']: assert len(value) == 5 caption = value[0] # caption, align, x, head, body # Set n to the index where the attributes start n = 0 while n < len(caption) and not \ (caption[n]['t'] == 'Str' and caption[n]['c'].startswith('{')): n += 1 try: attrs = extract_attrs(caption, n) value.insert(0, attrs) except (ValueError, IndexError): pass
def test_extract_attrs_2(self): """Tests extract_attrs() #2.""" ## test.md: Test {#eq:id .class tag="foo"}. ## # Command: pandoc test.md -f markdown+smart -t json src = eval(r'''{"meta":{},"blocks":[{"t":"Para","c":[{"t":"Str","c":"Test"},{"t":"Space"},{"t":"Str","c":"{#eq:id"},{"t":"Space"},{"t":"Str","c":".class"},{"t":"Space"},{"t":"Str","c":"tag="},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"foo"}]]},{"t":"Str","c":"}."}]}],"pandoc-api-version":[1,17,5,1]}''') # Check src against pandoc-1.17.2 md = subprocess.Popen(('echo', 'Test {#eq:id .class tag="foo"}.'), stdout=subprocess.PIPE) output = eval(subprocess.check_output( 'pandoc -f markdown+smart -t json'.split(), stdin=md.stdout).strip()) self.assertEqual(src, output) # Hand-coded expected = ['eq:id', ['class'], [['tag', 'foo']]] # Make the comparison self.assertEqual(extract_attrs(src['blocks'][0]['c'], 2), expected)
def test_extract_attrs_1(self): """Tests extract_attrs() #1.""" ## test.md: Test {#eq:id .class tag="foo"}. ## # Command: pandoc test.md -t json src = eval(r'''{"blocks":[{"t":"Para","c":[{"t":"Str","c":"Test"},{"t":"Space"},{"t":"Str","c":"{#eq:id"},{"t":"Space"},{"t":"Str","c":".class"},{"t":"Space"},{"t":"Str","c":"tag="},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"foo"}]]},{"t":"Str","c":"}."}]}],"pandoc-api-version":[%s],"meta":{}}'''%PANDOC_API_VERSION) # Check src against current pandoc md = subprocess.Popen(('echo', 'Test {#eq:id .class tag="foo"}.'), stdout=subprocess.PIPE) output = eval(subprocess.check_output( 'pandoc -t json'.split(), stdin=md.stdout).strip()) self.assertEqual(src, output) # Hand-coded expected = ['eq:id', ['class'], [['tag', 'foo']]] # Make the comparison self.assertEqual(extract_attrs(src['blocks'][0]['c'], 2).list, expected)
def test_extract_attrs_2(self): """Tests extract_attrs() #2.""" ## test.md: Test {#eq:id .class tag="foo"}. ## # Command: pandoc test.md -f markdown+smart -t json src = eval( r'''{"meta":{},"blocks":[{"t":"Para","c":[{"t":"Str","c":"Test"},{"t":"Space"},{"t":"Str","c":"{#eq:id"},{"t":"Space"},{"t":"Str","c":".class"},{"t":"Space"},{"t":"Str","c":"tag="},{"t":"Quoted","c":[{"t":"DoubleQuote"},[{"t":"Str","c":"foo"}]]},{"t":"Str","c":"}."}]}],"pandoc-api-version":[1,17,5,1]}''' ) # Check src against pandoc-1.17.2 md = subprocess.Popen(('echo', 'Test {#eq:id .class tag="foo"}.'), stdout=subprocess.PIPE) output = eval( subprocess.check_output('pandoc -f markdown+smart -t json'.split(), stdin=md.stdout).strip()) self.assertEqual(src, output) # Hand-coded expected = ['eq:id', ['class'], [['tag', 'foo']]] # Make the comparison self.assertEqual(extract_attrs(src['blocks'][0]['c'], 2), expected)