Please help me understand output from epubcheck - epub

I am modifying an ebook I purchased. I'm getting stuck on an error that epubcheck finds. The error is:
/path/to/ebook/file.html(43,53): element "blockquote" not allowed here; expected the element end-tag, text or element "a", "abbr", "acronym", "applet", "b", "bdo", "big", "br", "cite", "code", "del", "dfn", "em", "i", "iframe", "img", "ins", "kbd", "map", "noscript", "ns:svg", "object", "q", "samp", "script", "small", "span", "strong", "sub", "sup", "tt" or "var" (with xmlns:ns="http://www.w3.org/2000/svg")
Line 43 of the file in question looks like:
<h4 class="calibre41"><blockquote class="calibre42"><span class="calibre2">SUGGESTIONS FOR GETTING THE MOST FROM YOUR STUDY OF THE SCRIPTURES AND OF THIS COMPANION VOLUME</span></blockquote></h4><div class="calibre43"> </div>
I'm getting many similar messages and I don't know what they mean. Can someone help me understand what is wrong with this line so I can fix it (and the many others)?
Thanks!

A <blockquote> tag is not allowed inside an <h4> tag. This rule applies to HTML in general, not just epub. Change the markup so that it's valid, either by replacing <blockquote> with one of the allowed tags, or removing it. Note: you might lose some CSS styling if you don't preserve the class attribute. You might lose it anyway if the <blockquote> tag is styled explicitly.

Related

Forward slashes in input object do not render in Handlebars #each partial

When trying to render a Handlebars partial, all the forward slashes in my object render as spaces instead.
My input object is like this:
let mySkills = {
"skills": [
{
"name": "HTML5",
"icon": "/img/HTML5.png"
},
{
"name": "CSS3",
"icon": "/img/CSS3.png"
},
{
"name": "JavaScript",
"icon": "/img/JS.png"
}
]
};
The Handlebars partial is like this (I simplified it for this post. I know it won't look right, but the point is that the output code is incorrect):
Handlebars.registerPartial(
'skillsBullet',
'<ul>{{#each skills}}<li style="background-image: url("{{icon}}");">{{name}}</li>{{/each}}</ul>'
);
$('#skills-container').append(Handlebars.compile($('#skills-template').html())(mySkills));
But the output snippet is like this:
Broken background image url
Here is a Codepen. You can inspect the Elements panel to see the bug in the above screenshot: https://codepen.io/car1sle/pen/NWYJeee
I already tried:
Putting backslashes before the forward slashes in the object like this "icon": "\/img\/HTML5.png"
Doing triple curly braces in the Partial like this {{{icon}}}
Doing regular brackets inside the braces in the Partial like this {{[icon]}}
Your issue is due to the fact that your resultant HTML is malformed.
Let's examine this piece of your partial:
<li style="background-image: url("{{icon}}");">
You are using double-quotes (") to wrap both the style= value and the url() value. After Handlebars processing, the resultant HTML becomes:
<li style="background-image: url("/img/CSS3.png");">
This HTML instructs the browser that the style value - between the two double-quotes - is background-image: url(. The browser then tries to determine what to do with the /img/CSS3.png");" and it, because browsers are forgiving of malformed HTML, it ignores it and carries on.
In order to get your code to work properly, you will need to use different quotes for the background-image URL than you use for the style attribute.
<li style="background-image: url(\'{{icon}}\');">
I have forked for your Codepen to provide an example.

Slack Section Block: Markdown Preformatted Overflow Issue with long strings

When using the Lego... I mean Block Kit builder, I need to send some pre-formatted data using markdown's "```" syntax, the problem is when it encounters a long un-spaced strings (such as a URL) the format breaks when displaying on slack. This is isolated to the block kit builder as sending the message through the app/web app shows up fine.
I tried using the verbatim property, however that did not work.
First block displays the error, second block displays correctly due to spaces being present and no long-words
[
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "```I_love_oat_cake_croissant_jujubes_tiramisu_pudding_pastry_sugar_plum_I_love._Apple_pie_powder_bear_claw_croissant_candy_muffin_gummi_bears.```"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "```I love oat cake croissant jujubes tiramisu pudding pastry sugar plum I love. Apple pie powder bear claw croissant candy muffin gummi bears.```"
}
}
]
I expected it to mimic what a user's input would display when entering data on the app, which is breaking on long words when necessary, but instead the block is getting shifted off to the left and cutting off some of the data.
Here is an example in both the builder and the application
Currently as of 4/15: This is a known bug so all I can do is wait. They do not offer a public facing site that lists known issues like this, but I have emailed them to track the bug and hopefully if it gets fixed soon I will update this answer.

Inserting date command into snippet sublime text 3

I am trying to create a snippet for starting a LaTex document where the packages and everything is filled in, but I also want it to automatically fill in the date. I have the insertdate package, but I did not understand how to use it. I have the snippet code:
<snippet>
<content><![CDATA[
\documentclass{article}
\usepackage{amsmath}
\title{${1:title}}
\author{...}
\date{[Todays date here automatically]}
\begin{document}
\maketitle
$0
\end{document}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>document</tabTrigger> -->
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>text.tex.latex</scope> -->
</snippet>
It's not directly possible to expand a snippet in the traditional way (i.e. documentTab in this case) and have one or more of the fields in the snippet dynamically update; for that you would need extra glue plugin code.
The InsertDate package provides a variety of ways to insert a date into your document, but that extra glue is not provided. An example of a way to do that is outlined below.
All of the examples below assume the following snippet content in a file named Packages/User/NewLatexDocument.sublime-snippet; in the following examples, replace that path with the appropriate path and file name of your snippet.
<snippet>
<content><![CDATA[
\documentclass{article}
\usepackage{amsmath}
\title{${2:title}}
\author{...}
\date{${1:date}}
\begin{document}
\maketitle
$0
\end{document}
]]></content>
<description>Create new LaTeX Document</description>
<tabTrigger>document</tabTrigger>
<scope>text.tex.latex</scope>
</snippet>
This is a version of the one you provided in your question, but note that the version in your question is broken because the <tabTrigger> and <scope> lines are terminated with the --> comment sequence, which is not valid.
Of particular interest here is that the snippet fields have been re-ordered so that the date field is the first one and the title is the second one, for reasons we'll see in a moment.
It's also important to know where your User package is; if you're not sure, you can find the location by selecting Preferences > Browse Packages... from the menu. On MacOS, the menu location is Sublime Text > Preferences > Browse Packages... instead.
Method 1: Expanding the snippet via the tab trigger (no extra plugin)
It's possible to invoke the snippet with the tab trigger (here the word document), but as mentioned above there's no direct way to get the InsertDate package to insert the date for you.
What you can do however is use one of the default key bindings to trigger a manual date insertion. An example of that would be pressing F5, which displays a panel of date options and then inserts one. From there you can press Tab to continue on in the snippet.
See the documentation for the package for all of the various keys that you can use here or to get a feel for how you could make your own custom binding to insert in the format of your choice directly.
This isn't directly what you want to do, but it's also the method that requires the least amount of work to set up.
Method 2: Expanding the snippet via a macro
By using a Sublime macro, you can take a single action (key press, command palette entry, etc) and have both actions happen automatically; expand the snippet and insert the date.
To do that, you would save the following contents into a sublime-macro in your User package. The name doesn't matter so long as you remember what you used because you're going to need it in a moment. In my examples below, the filename is Packages/User/NewLatexDocument.sublime-macro.
[
{ "command": "insert_snippet", "args": {"name": "Packages/User/NewLatexDocument.sublime-snippet"} },
{ "command": "insert_date", "args": {"format": "%x"} },
{ "command": "next_field" },
]
Make sure that the filename in the insert_snippet argument matches the name of your snippet. You probably also want to change the date format to whatever format you prefer.
When you invoke the macro, it inserts the snippet, then triggers the insert_date function to insert the date (this is why the date field is first) and skips to the next field, at which point you can start manually filling out the rest of the snippet.
You can see this in action by selecting Tools > Macros > User > NewLatexDocument from the menu; the final item will be the name of your sublime-macro file.
Now you can create a key binding that triggers the macro for you so you don't have to select it from the menu. As above, remember to ensure that the file name of the sublime-macro is the file you created.
{
"keys": ["ctrl+alt+shift+d"],
"command": "run_macro_file",
"args": {
"file": "res://Packages/User/NewLatexDocument.sublime-macro"
}
},
Alternatively, you can create a sublime-commands file in your User package (for example, MyCustomCommands.sublime-commands) with the following contents, which will make the command available in the Command Palette:
[
{
"caption": "Create new Latex Document",
"command": "run_macro_file",
"args": {
"file": "res://Packages/User/NewLatexDocument.sublime-macro"
}
},
]
Method 3: Expanding the snippet via the tab trigger (w/extra plugin)
This example is the closest to what you want to do but it requires a little bit more work. Additionally note that it requires you to enter the full expansion text (e.g. document) and won't trigger on a partial match if that happens to be the best completion.
To start with, make sure you've created the macro from Method 2, as this method uses that same macro but triggers it in a different way.
Next, select Tools > Developer > New Plugin... from the menu and replace the text of the default plugin with the following code, then save it as a .py file; in my example I named the file new_latex_document.py:
import sublime
import sublime_plugin
class NewLatexDocumentCommand(sublime_plugin.TextCommand):
def run(self, edit):
# Get the last word of the line the cursor is on
point = self.view.sel()[0].b
line = self.view.substr(self.view.line(point))
word = line.split()[-1]
# Remove the trigger word
self.view.replace(edit, sublime.Region(point, point - len(word)), "")
# Run the macro
self.view.run_command("run_macro_file", {
"file": "res://Packages/User/NewLatexDocument.sublime-macro"
})
This creates a command named new_latex_document (named based on the name of the class, not the name of the file you save the plugin in) which, when you invoke it, will erase the last word on the line where the cursor is sitting and then run the macro from method 2 above.
Now you need to add the following key binding to your custom keys:
{
"keys": ["tab"],
"command": "new_latex_document",
"context": [
{ "key": "selector", "operator": "equal", "operand": "text.tex.latex"},
{ "key": "preceding_text", "operator": "regex_match", "operand": "^.*document$", "match_all": true },
{ "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
{ "key": "num_selections", "operator": "equal", "operand": 1},
{ "key": "selection_empty", "operator": "equal", "operand": "true", "match_all": true },
]
},
Broken down, this say that the Tab key should run our new command, but only in files of type text.tex.latex, where the text prior to the cursor location is the word document with no text following it, and when there is only a single cursor in the document with an empty selection.
Now when you enter the word document followed by Tab and these conditions are satisfied, the custom command runs, removing the trigger word document and then expanding the macro out to insert the snippet and the date.
Note that in this case, the tabTrigger and the scope in the sublime-snippet file are ignored, which is why the key binding needs to explicitly set them.
This plugin could be enhanced if desired; for example instead of running the run_macro_file command, it could just execute each of the commands from the macro directly, saving a step.
If you had many such expansions you wanted to do with a date, it's probably better to use an even more customized plugin; using an on_query_completions handler for example would allow the triggering to happen without requiring the key bindings.
That's a more advanced topic, however.

How to create a composite caption on Neo4j Grass style file?

For example,
"node.Person": {
"color": "#FF756E",
"border-color": "#E06760",
"text-color-internal": "#FFFFFF",
"caption": "{name}"
}
I want the "Person" to be displayed as the label of the node, and "name" and "age" to be displayed as the attributes of the node. Currently, only 'name' is displayed as the caption.
How to change the code above?
EDITED:
Neo4j people, how did you generate the graphs in the book? Thank you. This is one example below.
You can do it by editing the styles. Do this by typing ":style" to the neo browser UI, copy-paste the styles to text editor and just add the fields to the caption in curly brackets e.g.
"node.Person": {
"defaultCaption": "<id>",
"diameter": "50px",
"color": "#A5ABB6",
"border-color": "#9AA1AC",
"text-color-internal": "#FFFFFF",
"caption": "{name} {age}"
}
Would result in showing Person entities with name and age on them.
As I said in the comments of my answer its not possible. My anwser is as close as you can get. "node.MESSAGE": { "caption":"Message name:{NAME}" }. You can only write directly onto the node. I recommend to use different colours for different labels

Umbraco - Add spacing under element

The question might seem stupid. but i really can't find what i should type on the "Add spacing under element" text box to achieve the spacing from the CMS and not hard-coded.
In an element properties you can see this window:
Umbraco version 7.2.5 assembly: 1.0.5610.18894
Free License for now but planning to get one this week.
Okay I got your point. You are using Grid Layout.
By default Umbraco Grid layout datatype have setting class and styling background image as below
This can be found in Developer -> Datatypes - > datatype you have created with "Grid Layout", You can find data type name in Setting->Document types -> Name of home doc type -> generic properties
You can change settings and styles by clicking edit, it contains json data as below. This is default value
For setting
[
{
"label": "Class",
"description": "Set a css class",
"key": "class",
"view": "textstring"
}
]
For Style
[
{
"label": "Set a background image",
"description": "Set a row background",
"key": "background-image",
"view": "imagepicker",
"modifier": "url({0})"
}
]
Get full details on link
Now your scenario.
I think according to description, you have used this to add padding-bottom or margin-bottom style on the element. So you must use values like "20px" or "10px". Try only numbers like "10" if this don't work

Resources