How can I replicate GitHub's app code block style in UITextView? - uitextview

I am trying to create a markdown editor for fun and because I was interested in learning TextKit. I am working on iOS devices only, so I only have UIKit framework at my disposal, also I watched this WWDC18 video which explains some best practices to adopt with TextKit. At first I was really interested in knowing how to get the same result that the video shows at 22:13.
The code shown by the dev in the video makes use of AppKit and it wraps code in that rectangle by replacing the code section with a NSMutableParagraphStyle and by providing a custom NSTextBlock to the latter. As you can guess, I can't subclass NSTextBlock in UIKit and therefore I can't replicate the example shown.
I have something a little bit harder to ask though, what I really wanted to replicate is the GitHub application code block style, this is the final result that I would like to replicate:
As you can see it should have a rounded rectangle with a custom background color and also it needs to be scrollable in order to make code expand as much as it needs (I am not interested in syntax highlighting).
How can I achieve something like this if NSTextBlock is not available in UIKit?
For the moment all I have done is override NSTextStorage to set the correct font to the code section with custom NSAttributedString.

I have investigated in the app and noticed that it is managed by Ryan Nystrom which is the creator of GitHawk prior to moving to GitHub. The GitHawk markdown reader is very similar to the one that you find in the GitHub application and the funny thing is that GitHawk is open source so I took a look at that code and tried to understand how that could be replicated.
Turns out that GitHawk heavily uses IGListKit framework and parses markdown in ListDiffable elements, specifically the code blocks ListDiffables are given to a ListSectionController that created an horizontal UIScrollView to display code.
I gave up trying to understand more on this because GitHawk code is really really entangled and it is really hard, near impossible, to extract the specific functionality.

Related

Kivy MapView offline

I'm planning to write a Kivy app containing a (small) offline map. Kivy's Mapview widget seems to be a good choice to display maps but before I start diving into it further one question that I couldn't figure out: Is it possible to use Mapview offline, by using locally stored tiles?
I managed to do it, it turns out it is not that complicated to do but it took some research (at least for a beginner like me). Here is a rough outline:
1. MapView supports mbtiles as source as detailed in the documentation - mbtiles can be created in TileMill
2. I wanted a map in Openstreetmap style, so I downloaded openstreetmap-carto from github. The installation manual explains quite well what needs to be done in order to obtain a map in this style
4. There the biggest challenge was to set up and manipulate a PostGIS database. This link helped: http://www.bostongis.com/PrinterFriendly.aspx?content_name=loading_osm_postgis
There were some additional issues along the way but all could be solved by combing through the internet.

Using Glade Interface Designer with Vala (programing language)

Good resources for using Glade [Interface Designer] with Vala seem to be very sparse, and I'm having a difficult time getting started with Glade.
I did find a tutorial that seemed pretty good last year, but Ican no longer locate it.
Basically, I want to use Glade to do the GUI stuff, and then somehow "hook" it into my Vala code. How do we do this?
Glade generates a UI description in an XML format. GTK contains a class called Gtk.Builder which reads this XML and constructs a widget hierarchy.
"Traditionally", the way to tie the two together is to give the widgets meaningful names in Glade, and then use widget = Gtk.Builder.get_object(name) to grab the widget for use in your programme. You'll find quite a few examples like this on the web (google "vala gtkbuilder" or something similar to find them).
However, the latest versions of Vala and GTK have some new features to cut out quite a bit of the boilerplate from the way things have been done in the past. It's very new so you won't find many examples yet, but this blog post has all the details:
http://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/
at the GTK tutorial there's simple vala sample where they show how to load an xml glade file.
and for glade:
I would prefere learning how to design the gui in vala first because it will give you a better understanding of how GTK works. layouts like gtk.box and gtk.window etc.

Any way in Expression Engine to simulate Wordpress' shortcode functionality?

I'm relatively new to Expression Engine, and as I'm learning it I am seeing some stuff missing that WordPress has had for a while. A big one for me is shortcodes, since I will use these to allow CMS users to place more complex content in place with their other content.
I'm not seeing any real equivalent to this in EE, apart from a forthcoming plugin that's in private beta.
As an initial test I'm attempting to fake shortcodes by using delimited strings (e.g. #foo#) in the content field, then using a regex to pull those out and pass them to a function that can retrieve the content out of EE's database.
This brings me to a second question, which is that in looking at EE's API docs, there doesn't appear to be a simple means of retrieving the channel entries programmatically (thinking of something akin to WP's built-in get_posts function).
So my questions are:
a) Can this be done?
b) If so, is my method of approaching it reasonable? Or is there something stupidly obvious I'm missing in my approach?
To reiterate, my main objective here is to have some means of allowing people managing content to drop a code in place in their content that will be replaced with channel content.
Thanks for any advice or help you can give me.
Here's a simple example of the functionality you're looking for.
1) Start by installing Low Replace.
2) Create two Global Variables called gv_hello and gv_goodbye with the values "Hello" and "Goodbye" respectively.
3) Put this text into the body of an entry:
[say_hello]
Nice to see you.
[say_goodbye]
4) Put this into your template, wrapping the Low Replace tag around your body field.
{exp:low_replace
find="[say_hello]|[say_goodbye]"
replace="{gv_hello}|{gv_goodbye}"
multiple="yes"
}
{body}
{/exp:low_replace}
5) It should output this into your browser:
Hello
Nice to see you.
Goodbye
Obviously, this is a really simple example. You can put full blown HTML into your global variable. For example, we've used that to render a complex, interactive graphic that isn't editable but can be easily dropped into a page by any editor.
Unfortunately, due to parse order issues, EE tags won't work inside Global Variables. If you need EE tags in your short code output, you'll need to use Low Variables addon instead of Global Variables.
Continued from the comment:
Do you have examples of the kind of shortcodes you want to support/include? Because i have doubts if controlling the page-layout from a text-field or wysiwyg-field is the way to go.
If you want editors to be able to adjust layout or show/hide extra parts on the page, giving them access to some extra fields in the channel, is (imo) much more manageable and future-proof. For instance some selectfields, a relationship (or playa) field, or a matrix, to let them choose which parts to include/exclude on a page, or which entry from another channel to pull content from.
As said in the comment: i totally understand if you want to replace some #foo# tags with images or data from another field (see other answers: nsm-transplant, low_replace). But, giving an editor access to shortcodes and picking them out, is like writing a template-engine to generate ee-template code for the ee-template-engine.
Using some custom fields to let editors pick and choose parts to embed is, i think, much more manageable.
That being said, you could make a plugin to parse the shortcodes from a textareas content, and then program a lot, to fetch data from other modules you want to support. For channel entries you could build out of the channel data library by objectiveHTML. https://github.com/objectivehtml/Channel-Data
I hear you, I too miss shortcodes from WP -- though the reason they work so easily there is the ubiquity of the_content(). With the great flexibility of EE comes fewer blanket solutions.
I'd suggest looking at NSM Transplant. It should fit the bill for you.
There is also a plugin called Shortcode, which you can find here at
Devot-ee
A quote from the page:
Shortcode aims to allow for more dynamic use of content by authors and
editors, allowing for injection of reusable bits of content or even
whole pieces of functionality into any field in EE

Is there another way to fix Yesod's nicHtmlField?

I've been rewriting my (fairly simple) website using Yesod as a way to get familiar with the framework. Part of that involves serving some simple static (but formatted) content. To do that I decided to use the nicHtml field that is described in the Yesod book:
http://www.yesodweb.com/book/forms
It allows simple formatting and, as the book says, "thanks to the xss-sanitize package, all user input is validated and ensured to not have XSS attacks."
However, all is not well. Some formatting seems to work when you enter it into the field, but gets wiped out somewhere between entry and submission. In particular, the form uses css embedded in 'style' attributes to do things like center text, and it is these css based formatting elements that seem to get wiped out.
I used print statements to check that it wasn't my code which was somehow messing it up. Since it doesn't seem to be, I assume that xss-sanitize doesn't like any embedded css and removes it. Modifying Yesod.Form.Nic to remove the call to sanitizeBalance appears to fix the problem, so that would seem to be the cause.
Now, I can just leave it like that, since editing these static pages requires being a trusted user anyway (i.e. me at the moment), so I don't care too much about validating out nastiness. But it feels like what it is, a hack, so my question is - is there any other way around this? Or is there another package I don't know about that provides a non-broken HTML editor field for Yesod?
Will you file a bug on the Yesod issue tracker for this? I think we are going to have to allow basic css through the editor no matter which editor we use. In your case of a trusted user, right now you could find the NicEdit field type and create a similar type that won't get filtered at all. Perhaps we should create such a field.
We're actually looking at other possible rich text editors right now for use in the Yesod website, so most likely whatever we use there will end up with a module in yesod-form. Most recently Greg pointed out Aloha editor which on first glance looks pretty cool.

Shortest path to render from DirectWrite to Direct3D11?

Man so much has changed since I learned DirectX 7.
Everywhere I look (except Wikipedia), it says I have to render from DWrite to D2D or GDI before I can do anything.
Is that Wikipedia article wrong? Can I not render to Direct3D?
I'd like to avoid having to render to D2D, since apparently, to get D2D to write to D3D, you have to open up a D3D10.1 device as well.
Does it really take all this just to render text in D3D11?
Unfortunately, Microsoft decided to remove native text support from their DirectX API. Now you can either use DirectWrite, and then as you said render to GDI or D2D, which is somewhat clunky, or alternatively, make your own font-handling class, and use that (which is what I've chosen to done for my project).
There is a good tutorial on how to produce a custom Font-handling class, here: http://www.rastertek.com/dx11tut12.html
Obviously, you should write your own, but it provides a good starting point, and allows you to see all the necessary proceedures (something you will probably want to add will be support for multiple fonts, for which I recommend creating a Font class, which your Font-Handler stores with an associative string in a std::map< char*, Font* >).
Hope this helps! :)

Resources