NSRTFPboardType & вставить в окно браузера Gmail?

У меня есть NSTextView который содержит некоторый текст с атрибутами (подсветка синтаксиса). Я пытаюсь использовать опцию копирования, которая сохраняет подсветку синтаксиса, чтобы я мог вставить ее в текстовое окно Gmail. В настоящее время выделение не появляется, когда я копирую и вставляю его, однако, если бы мне пришлось скопировать следующий раздел прямо со страницы stackru:

- (void) copyAsRTF
{
    NSPasteboard *pateboard = [NSPasteboard generalPasteboard];
    NSData * rtfData = [[self textStorage] RTFFromRange: [self selectedRange]
                                     documentAttributes: nil];

    if (rtfData)
    {
        NSString * test = [[NSString alloc] initWithData: rtfData
                                                encoding: NSUTF8StringEncoding];

        [pateboard declareTypes: @[NSRTFPboardType]
                          owner: self];

        [pateboard setData: rtfData
                   forType: NSRTFPboardType];
    } // End of we had data
} // End of copyAsRTF

И вставьте его в Gmail, он вставит с полным синтаксическим выделением без проблем. Приведенный выше код - это то, что я использую для генерации своего кода RTF, и я могу подтвердить, что он генерирует правильный RTF, так как у меня есть test переменная генерируется.

Есть идеи, что я здесь делаю не так? Насколько я понимаю, это должно работать.

(Следует отметить, что я пробовал в нескольких браузерах - Chrome, Safari и Firefox).

2 ответа

Решение

Как выяснилось в комментариях, чтобы работать в chrome, вам нужно скопировать текст в формате html (тип public.html pasteboard) или, возможно, оба типа html и rtf.

Основываясь на комментариях к @Sega-Zero, я придумал следующее (немного небрежно, но это помогает). Для моих конкретных потребностей html color & font должен соответствовать приписанной строке, поэтому я перечисляю это и создаю html переменную. Это работает в Safari, Chrome и Firefox.

#define PasteBoardTypeHTML          @"public.html"

- (void) copyAsRTF
{
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];

    // Get our RTF data
    NSData * rtfData = [[self textStorage] RTFFromRange: [self selectedRange]
                                     documentAttributes: nil];

    // Get the HTML for our current data
    NSData *htmlData = [[self htmlForRange: self.selectedRange] dataUsingEncoding: NSUTF8StringEncoding];

    NSMutableArray * clipboardTypes = [NSMutableArray array];
    if (nil != rtfData)
    {
        [clipboardTypes addObject: NSPasteboardTypeRTF];
    } // End of we have rtf

    if(nil != htmlData)
    {
        [clipboardTypes addObject: PasteBoardTypeHTML];
    } // End of we have html

    // Set our pasteboard types (types need to be declared before we call setData).
    [pasteboard declareTypes: clipboardTypes.copy
                       owner: self];

    if (rtfData)
    {
        [pasteboard setData: rtfData
                   forType: NSPasteboardTypeRTF];
    } // End of we have rtf

    if(htmlData)
    {
        [pasteboard setData: htmlData
                   forType: PasteBoardTypeHTML];
    } // End of we have html
} // End of copyAsRTF

- (NSString *) htmlForRange: (NSRange) range
{
    NSMutableString * htmlOutput = [NSMutableString stringWithString: @"<meta charset='utf-8'><pre>"];

    [[self textStorage] enumerateAttributesInRange: range
                                           options: 0
                                        usingBlock:
     ^(NSDictionary * attributes, NSRange range, BOOL * stop)
     {
         NSString * actualCode = [[self textStorage].string substringWithRange: range];
         actualCode = [self textToHtml: actualCode];

         NSMutableString * currentHtml = [NSMutableString stringWithString: @"<span"];
         NSColor * color = attributes[NSForegroundColorAttributeName];
         NSFont  * font  = attributes[NSFontAttributeName];

         NSMutableArray * fontStyles = [NSMutableArray array];

         if(nil != color)
         {
             NSString * fontColorStyle =
                [NSString stringWithFormat: @"color: %@;", [color hexadecimalValue]];

             [fontStyles addObject: fontColorStyle];
         } // End of we have a color

         if(nil != font)
         {
             NSString * fontDetailsStyle =
             [NSString stringWithFormat: @"font-family: %@;", font.familyName];
             [fontStyles addObject: fontDetailsStyle];
         } // End of we have a font

         if(nil != fontStyles && fontStyles.count > 0)
         {
             [currentHtml appendFormat: @" style=\"%@\"", [fontStyles componentsJoinedByString: @" "]];
         } // End of we have font styles

         [currentHtml appendString: @">"];

         [currentHtml appendString: actualCode];
         [currentHtml appendString: @"</span>"];

         // Add our section
         [htmlOutput appendString: currentHtml];
     }]; // End of attribute enumerations

    // End of html output
    [htmlOutput appendString: @"</pre></meta>"];

    return htmlOutput.copy;
} // End of htmlForRange:

- (NSString*)textToHtml:(NSString*)htmlString
{
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"&"  withString:@"&amp;"];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<"  withString:@"&lt;"];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@">"  withString:@"&gt;"];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"""" withString:@"&quot;"];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"'"  withString:@"&#039;"];
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br>"];
    return htmlString;
} // End of textToHtml:
Другие вопросы по тегам